【问题标题】: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(没有重用标识符和出队),但在一些相当静态的场景中它会简化事情。
【问题讨论】:
标签:
uitableview
reuseidentifier
【解决方案1】:
UITableView 由 Apple 优化,因此它使用相当少量的内存,但在单元格出现在屏幕上时仍然具有良好的性能。当您执行此类非标准操作并规避优化时,您会将整台机器弄得一团糟。这是我的建议。如果您现在将一个特定的行作为实例变量保存,为什么不简单地尝试为它的重用标识符赋予一个唯一的名称呢?让工具包解决。
【解决方案2】:
使reuseIdentifier 等于nil 不是一个好习惯。始终使用字符串/名称初始化 reuseIdentifier。 cellForRowAtIndexPath 通过查看它们的reuseIdentifiers 重新加载行。如果使用现有的reuseIdentifier 找到缓存的单元格,它将直接显示这些单元格,而不分配和初始化新的单元格。使其成为nil 会导致问题。所以,制作reuseidentifier=@"cell" 或你喜欢的东西。这将解决您的问题。