为啥手动重用的 UITableViewCell 在重新加载行时会消失?

Posted

技术标签:

【中文标题】为啥手动重用的 UITableViewCell 在重新加载行时会消失?【英文标题】:Why does a manually reused UITableViewCell disappear on row-reload?为什么手动重用的 UITableViewCell 在重新加载行时会消失? 【发布时间】:2012-11-26 22:34:30 【问题描述】:

如果我使用reuseidentifier=nil 保持一个固定的UITableViewCell 作为ivar,并为特定行返回此实例,然后使用[tableView reloadRowsAtIndexPaths:withRowAnimation:] 专门重新加载此行,则行内容会消失(或有时会闪烁)。当我滚动并返回时,它再次变得可见。另一方面,如果我做[tableView reloadData],它不会消失。

为什么当我重新加载行时它消失了? 当我重新加载整个表时,为什么不呢?

这是一个示例项目:https://github.com/hannesoid/HOTableViewTests

我在 ios 6 上对此进行了测试。 我知道通常不建议以这种方式手动重用 UITableViewCell(没有重用标识符和出队),但在一些相当静态的场景中它会简化事情。

【问题讨论】:

【参考方案1】:

UITableView 由 Apple 优化,因此它使用相当少量的内存,但在单元格出现在屏幕上时仍然具有良好的性能。当您执行此类非标准操作并规避优化时,您会将整台机器弄得一团糟。这是我的建议。如果您现在将一个特定的行作为实例变量保存,为什么不简单地尝试为它的重用标识符赋予一个唯一的名称呢?让工具包解决。

【讨论】:

【参考方案2】:

使reuseIdentifier 等于nil 不是一个好习惯。始终使用字符串/名称初始化 reuseIdentifiercellForRowAtIndexPath 通过查看它们的reuseIdentifiers 重新加载行。如果使用现有的reuseIdentifier 找到缓存的单元格,它将直接显示这些单元格,而不分配和初始化新的单元格。使其成为nil 会导致问题。所以,制作reuseidentifier=@"cell" 或你喜欢的东西。这将解决您的问题。

【讨论】:

以上是关于为啥手动重用的 UITableViewCell 在重新加载行时会消失?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何在不同的 UITableViewCell 中重用 UIView

使用 KVO 重用 UITableViewCell

UITableViewCell 重用后 topLayoutGuide 搞砸了

UITableViewCell 没有正确重用?

如何创建不可重用的 UITableViewCell

我的 UITableViewCell 正在重用以前的单元格 UIImage