0

在创建 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 中并且应该是可点击的。它不是。我让它在另一个视图上工作,但我在那个视图上放置了视图。有任何想法吗?

4

2 回答 2

6

不想创建一个新的UIWebView并将其添加为每次调用的子视图drawRect:这是一个非常糟糕的主意:

  1. 它会很慢。这些都是重物,而你正在创造成千上万个。
  2. 你没有摆脱旧的UIWebView对象。因此,您实际上是在将成千上万个它们叠加在一起。

您应该创建UIWebView once,可能在初始化程序中,或者其他一些只调用一次的方法。您还应该只将它作为子视图添加一次。

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

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

于 2011-01-11T18:49:52.647 回答
1

这是错误的。您不应该在 -drawRect: 内实例化 UIWebView: - 这可能会重复调用以刷新屏幕。

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

即使这样,UIWebView 也可能过于重量级,无法放置在每个单元格中。

你可能想看看这个

于 2011-01-11T18:51:20.470 回答