在drawRect方法中绘制时可以访问视图吗?

时间:2011-01-11 18:39:00

标签: iphone objective-c uiwebview core-graphics drawrect

在创建tableViewCell的内容视图时,我在drawRect中使用了drawInRect:withFont,drawAtPoint ......等等,因为我只需要放置一些文本。事实证明,所绘制文本的一部分需要是可点击的URL。所以我决定创建一个UIWebView并将其插入到我的drawRect中。一切似乎都很好,问题是没有发生与UIWebView的交互。我尝试启用交互,没有用。我想知道,因为使用drawRect:我正在绘制当前的图形上下文,我可以做些什么让我的子视图与用户交互?
这是我在UITableViewCell类中使用的一些代码。

-(void) drawRect:(CGRect)rect{  
    NSString *comment = @"something";
    [comment drawAtPoint:point forWidth:195 withFont:someFont lineBreakMode:UILineBreakModeMiddleTruncation];

    NSString *anotherCommentWithURL = @"this comment has a URL http://twtr.us";
    UIWebView *webView = [[UIWebView alloc] initWithFrame:someFrame];
    webView.delegate = self;
    webView.text = anotherCommentWithURL;
    [self addSubView:webView];
    [webView release];
}

正如我所说,视图很好,但是没有与外部的webView交互。 URL嵌入到HTML中,应该是可点击的。它不是。我让它在另一个视图上工作,但在那个视图上我提出了看法。 有什么想法吗?

2 个答案:

答案 0 :(得分:6)

想要创建新的UIWebView并将其作为每次调用的子视图添加到drawRect:这是坏主意:

  1. 这会很慢。那些是重物,你创造了成千上万的物品。
  2. 你没有摆脱旧的UIWebView对象。所以你基本上将成千上万的它们叠加在一起。
  3. 你应该创建UIWebView 一次,可能在初始化程序中,或者只调用一次的其他方法。您还应该只将其添加为子视图一次。

    创建数千个视图的行为肯定会导致您的问题。

    如果您的视图正在更改位置/大小,那么您可以覆盖setFrame:,并且除了调用超类'方法之外,还要调整UIWebView的框架,您肯定要维护它作为实例变量。

答案 1 :(得分:1)

这是错误的。你不应该在-drawRect中实例化UIWebView: - 可能会反复调用它来刷新屏幕。

相反,你应该至少创建一个UITableViewCell的子类,并添加一个UIWebView来保存你的所有文本。

即便如此,UIWebView可能太重了,不能放在每个单元格中。

您可能需要检查this