You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者黄嘉琦

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 10:06:04