Xcode13 iOS15下UITableView调用reloadData后返回不同cell问题
iOS15 UITableView cell实例复用异常问题解答
系统改动说明
iOS15针对UITableView的复用机制做了优化调整:系统新增了预生成cell的缓冲队列,调用[tableView reloadData]刷新列表时,会优先从缓冲队列中取出预生成的cell实例用于渲染,不再优先复用当前屏幕上正在展示的对应indexPath的cell,因此会出现同一indexPath多次查询返回不同cell实例的现象。该调整为系统官方的性能优化策略,不属于系统bug。
解决方案
方案一:直接回退旧版本逻辑(快速适配)
全局关闭UITableView的预取功能,即可恢复iOS14及更早版本的复用逻辑,操作成本最低:
// 初始化tableView时添加该配置 self.tableView.prefetchingEnabled = NO;
该属性从iOS10开始支持,对更低版本系统无影响,可直接全局添加。
方案二:优化业务实现逻辑(长期推荐)
UITableView的设计逻辑本身就不保证同一indexPath对应的cell实例唯一,所有依赖cell实例唯一的业务逻辑本身就不符合规范,建议做如下改造:
- 所有业务状态全部存储在数据源数组中,不要直接存储cell实例或者将状态临时存储在cell的属性里
- 每次
cellForRowAtIndexPath回调时,仅读取对应indexPath的数据源内容渲染cell - 需要修改cell展示效果时,先修改数据源对应的节点,再刷新对应indexPath即可
该方案不受系统版本变更影响,适配性和可维护性更高。
内容的提问来源于stack exchange,提问作者黄嘉琦
相关产品推荐
相关产品推荐

