UITableView cellForRowAt vs willDisplay

时间:2017-03-07 13:11:36

标签: ios uitableview autolayout uitableviewautomaticdimension

我有点沮丧。我有一个带有UITableView单元格的iOS 10项目UITableViewAutomaticDimension。我正确设置了约束。

最初我将我的细胞映射到

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

并且一切正常,但后来我读了一篇文章:https://medium.com/ios-os-x-development/perfect-smooth-scrolling-in-uitableviews-fd609d5275a5#.4rnbc4vyg并将我的数据映射移到了

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)

此后我的自动布局单元停止正常工作。

我的理解是,在cellForRowAt之后但在willDisplay之前计算高度,所以当我在willDisplay高度的映射已经为我的单元格设置并且我需要重新加载再次(这不好)。

任何人都可以证明/解释这个吗?

更新

发布问题后,我发现了这篇文章:https://tech.zalando.com/blog/proper-use-of-cellforrowatindexpath-and-willdisplaycell/

1 个答案:

答案 0 :(得分:4)

始终在func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

内设置您的单元格

Apple文档说明 cellForRowAt

  

要求单元格的数据源插入表视图的特定位置。

tableView(_:cellForRowAt:)

另一方面的

willDisplay 可用于在绘制视图之前覆盖单元格的某些属性。我建议如果你不确定willDisplay只是在cellForRowAt中做你所有的设置。

Apple的doc说有关willDisplay:

  

此方法为委托提供了覆盖表视图前面设置的基于状态的属性的机会,例如选择和背景颜色。

更多关于willDisplay在Apple的文档中: tableView:willDisplayCell:forRowAtIndexPath:

编辑:在阅读了您提供的链接后 - 我重申除非您确实有特定理由在 willDisplayCell 中设置您的单元格,否则只需在中执行此操作即可cellForRowAt 即可。