为啥手动重用的 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
不是一个好习惯。始终使用字符串/名称初始化 reuseIdentifier
。 cellForRowAtIndexPath
通过查看它们的reuseIdentifiers
重新加载行。如果使用现有的reuseIdentifier
找到缓存的单元格,它将直接显示这些单元格,而不分配和初始化新的单元格。使其成为nil
会导致问题。所以,制作reuseidentifier=@"cell"
或你喜欢的东西。这将解决您的问题。
【讨论】:
以上是关于为啥手动重用的 UITableViewCell 在重新加载行时会消失?的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 如何在不同的 UITableViewCell 中重用 UIView