【问题标题】:cellForRowAtIndexPath is not always called after reloadRowsAtIndexPaths even for valid indexPath即使对于有效的 indexPath,也不总是在 reloadRowsAtIndexPaths 之后调用 cellForRowAtIndexPath
【发布时间】:2013-12-24 16:40:21
【问题描述】:

我有一个表格视图,其中的单元格可以在用户点击单元格上的子视图时展开。

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

我发现这在大多数情况下都有效,但有时单元格不会更新。 挖掘了一下,我发现在这些有问题的单元格的情况下,永远不会调用 cellForRowAtIndexPath

据我所知,细胞膨胀的正常顺序是

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

reloadRowsAtIndexPathscellForRowAtIndexPath 之间,有一个对 tableView:heightForRowAtIndexPath: 的调用,其中包含受影响单元格的更新高度。

错误情况的顺序大致相同(就我可以逐步完成的代码而言),除了在桌子上的 heightForRowAtIndexPath 之后,cellForRowAtIndexPath 永远不会被调用.

结果是table view展开了cell但是在故障情况下内容没有更新,导致用户体验很差。

有没有人遇到过 UITableView 上的单元格更新问题,或者我遗漏了一些明显的东西?

  • 有几点需要注意:

    1. 当 reloadRowsAtIndexPaths 执行时,每个单元格的 indexPath 都是有效的(它不是 nil 并且指向 tableview 中的一个单元格) 功能和故障场景。

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

【问题讨论】:

  • 您是否可能在两次调用之间更改部分中的行数?停止 numberOfRowsInSection 并查看它的调用频率以及返回的内容。
  • 不,在 reloadRowsAtIndexPaths 调用之前和之后,每个部分的行数保持不变。
  • 你检查确定了吗?
  • 是的,我记录了每个部分的计数,它在 reloadRowsAtIndexPaths 前后保持不变。总行数也保持不变。

标签: ios iphone objective-c uitableview


【解决方案1】:

尽管我仍然无法准确判断 UITableView 在做什么,但我终于可以开始工作了。

高层:

  1. 有 2 个错误,一个与核心数据相关,另一个在 计算前者暴露的行高。

  2. 不幸的是,当一个单元格被 扩大。在我遇到的情况下,它导致了目标 单元格的位置被推到 tableview 的可见区域之外。

  3. 不知何故(这部分我不明白),UITableView 实际上并没有 将单元格移出可见区域,但它停止发送它 cellForRowAtIndexPath 消息(这是预期的,因为单元格是 不再可见)。

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

顺便说一下,感谢 Hot Licks,您的建议让我为受影响部分中的所有单元格添加了大量日志消息,这就是我发现其中一个前任单元格的高度偏离的原因。

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

tableView:didEndDisplayingCell:forRowAtIndexPath:

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

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 2018-04-20
    • 1970-01-01
    • 2013-06-22
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2020-06-04
    相关资源
    最近更新 更多