我有一个包含单元格的tableview,当用户点击单元格上的子视图时,可以展开这些单元格。
要扩展单元格,我调用 reloadRowsAtIndexPaths 传递单元格的indexPath数组。
我发现这在大多数情况下有效,但有时单元格不会更新。 四处搜寻,我发现在这些有缺陷的细胞的情况下,从来没有调用 cellForRowAtIndexPath 。
正如我所理解的,细胞扩增的正常序列是
*expandCellAtIndexPath: -> reloadRowsAtIndexPaths:withRowAnimation: -> tableView:cellForRowAtIndexPath:*
在 reloadRowsAtIndexPaths 和 cellForRowAtIndexPath 之间,调用tableView:heightForRowAtIndexPath:其中包含受影响单元格的更新高度。
对于错误的情况,序列大致相同(就我可以逐步执行的代码而言),除了在表上的 heightForRowAtIndexPath 之后, cellForRowAtIndexPath 永远不会被调用
结果是表视图扩展了单元格,但在错误的情况下内容尚未更新,导致用户体验不佳。
有没有人在UITableView上遇到过细胞更新这个问题,或者我错过了一些明显的东西?
有几点需要注意:
当reloadRowsAtIndexPaths执行时,每个单元格的indexPath都有效(它不是nil并且指向tableview中的单元格) 功能和错误的情况。
我的测试表明,同一行总是会在扩展期间触发故障情况,无论它位于何处 在表格视图的可见部分内。
答案 0 :(得分:2)
我终于开始工作了,虽然我仍然不能确切地说出UITableView正在做什么。
高级别:
有2个错误,一个核心数据相关,另一个是糟糕的假设 计算前者暴露的行高。
不幸的是,当一个细胞出现时,两个虫子都表现出来了 扩大。在我遇到的情况下,它引起了目标 单元格的位置被推到tableview的可见区域之外。
不知何故(这部分我没有得到),UITableView实际上并没有 将细胞移出可见区域但它停止发送它 cellForRowAtIndexPath消息(预期,就像单元格一样 不再可见了。
一旦我找到错误,渲染问题就消失了。
顺便说一下,感谢Hot Licks,你的建议让我为受影响部分内的所有细胞添加了大量日志信息,这就是我发现其中一个前身细胞的高度偏离的原因。
如果有人遇到类似症状,我建议实施
tableView:didEndDisplayingCell:forRowAtIndexPath:
UITableViewDelegate协议的方法,并检查不再接收 cellForRowAtIndexPath 的单元格是否作为该消息的参数。