适当的地方更新UITableViewCell内容

时间:2016-08-16 18:31:24

标签: ios uitableview

我一直在更新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
}

documentation还会在tableView:cellForRowAtIndexPath:中显示正在更新的内容。但是,今天I read

  

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

the same post中提到了这个原因。它谈到了

  

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

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

1 个答案:

答案 0 :(得分:1)

陈述是错误的。

  当滚动表时,

自定义单元格似乎“随机更改内容”

仅在

时发生
  • dequeueReusableCellWithIdentifiercellForRowAtIndexPath之外使用(误)。
  • 单元格的全部内容未可靠地设置为cellForRowAtIndexPath内的已定义状态。
  • cellForRowAtIndexPath之外操纵单元格的内容。

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

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

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