适当的地方更新UITableViewCell内容

我总是更新tableView:cellForRowAtIndexPath:UITableViewCell内容tableView:cellForRowAtIndexPath:像这样:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell:UITableViewCell = self.resultsTableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier) as UITableViewCell! // update cell content cell.backgroundColor = UIColor.clearColor() cell.textLabel?.text = myTextString return cell } 

该文档还显示了在tableView:cellForRowAtIndexPath:中更新的内容tableView:cellForRowAtIndexPath: . 但是,今天我读了

必须在显示之前设置单元格的内容。 我们不关心使用哪个单元对象。 我们关心的是它在传递给渲染器时有正确的东西显示。 因此,设置单元格内容的正确位置是tableView:willDisplayCell:forRowAtIndexPath:

在同一篇文章中提到了这个的原因。 它谈到了

…滚动表时自定义单元格似乎“随机更改内容”的问题。 发生这种情况的原因是因为单元格的内容是在tableView:cellForRowAtIndexPath:方法中设置的,这不是正确的地方。 在此方法中,系统只需要获取单元对象。 一旦显示一个单元格,系统将不会询问单元格对象,直到它丢失(即单元对象被销毁时),并且无法找到重用的单元格。 但是,如果找到替代品,则会重复使用,您最终会看到该重复使用的单元格的内容代替原始单元格。

那是对的吗? 我之前从未注意到过这个问题,但是我应该在tableView:willDisplayCell:forRowAtIndexPath:更新我的单元格内容tableView:willDisplayCell:forRowAtIndexPath: ? 我被文档误导了吗?

声明是错误的。

滚动表时,自定义单元格似乎“随机更改内容”

只有在

  • dequeueReusableCellWithIdentifiercellForRowAtIndexPath之外使用(mis)。
  • 单元格的整个内容未被可靠地设置为cellForRowAtIndexPath内的已定义状态。
  • cellForRowAtIndexPath之外操作单元格的内容。

强烈建议开发人员不要使用这三种情况中的任何一种。

因此,提供单元格并更新cellForRowAtIndexPath的内容完全没问题。

PS:我想willDisplayCell:forRowAtIndexPath:是来自macOS中基于单元格的 NSTableView的遗留方法,其中数据源委托方法不支持更改单元格的外观。