在reloadRowsAtIndexPaths之后,即使对于有效的indexPath,也不总是调用cellForRowAtIndexPath

时间:2013-12-07 07:39:57

标签: ios iphone objective-c uitableview

我有一个包含单元格的tableview,当用户点击单元格上的子视图时,可以展开这些单元格。

要扩展单元格,我调用 reloadRowsAtIndexPaths 传递单元格的indexPath数组。

我发现这在大多数情况下有效,但有时单元格不会更新。 四处搜寻,我发现在这些有缺陷的细胞的情况下,从来没有调用 cellForRowAtIndexPath

正如我所理解的,细胞扩增的正常序列是

*expandCellAtIndexPath: -> reloadRowsAtIndexPaths:withRowAnimation: -> tableView:cellForRowAtIndexPath:*

reloadRowsAtIndexPaths cellForRowAtIndexPath 之间,调用tableView:heightForRowAtIndexPath:其中包含受影响单元格的更新高度。

对于错误的情况,序列大致相同(就我可以逐步执行的代码而言),除了在表上的 heightForRowAtIndexPath 之后, cellForRowAtIndexPath 永远不会被调用

结果是表视图扩展了单元格,但在错误的情况下内容尚未更新,导致用户体验不佳。

有没有人在UITableView上遇到过细胞更新这个问题,或者我错过了一些明显的东西?

  • 有几点需要注意:

    1. 当reloadRowsAtIndexPaths执行时,每个单元格的indexPath都有效(它不是nil并且指向tableview中的单元格) 功能和错误的情况。

    2. 我的测试表明,同一行总是会在扩展期间触发故障情况,无论它位于何处 在表格视图的可见部分内。

1 个答案:

答案 0 :(得分:2)

我终于开始工作了,虽然我仍然不能确切地说出UITableView正在做什么。

高级别:

  1. 有2个错误,一个核心数据相关,另一个是糟糕的假设 计算前者暴露的行高。

  2. 不幸的是,当一个细胞出现时,两个虫子都表现出来了 扩大。在我遇到的情况下,它引起了目标 单元格的位置被推到tableview的可见区域之外。

  3. 不知何故(这部分我没有得到),UITableView实际上并没有 将细胞移出可见区域但它停止发送它 cellForRowAtIndexPath消息(预期,​​就像单元格一样 不再可见了。

  4. 一旦我找到错误,渲染问题就消失了。

    顺便说一下,感谢Hot Licks,你的建议让我为受影响部分内的所有细胞添加了大量日志信息,这就是我发现其中一个前身细胞的高度偏离的原因。

    如果有人遇到类似症状,我建议实施

    tableView:didEndDisplayingCell:forRowAtIndexPath:
    

    UITableViewDelegate协议的方法,并检查不再接收 cellForRowAtIndexPath 的单元格是否作为该消息的参数。

相关问题