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

iOS 15中tableView调用beginUpdates后heightForRowAt未调用如何解决

问题背景

iOS 15之前,调用如下代码即可触发heightForRowAt回调,无需重载cell内容就能更新cell高度:

self.tableView.beginUpdates()
self.tableView.endUpdates()

iOS 15对UITableView的高度计算逻辑做了优化,当系统判定没有数据源变更时,上述代码不会触发高度重计算回调,原有方案失效。

不重载cell数据前提下刷新高度的解决方案

方案1:使用performBatchUpdates(最优,兼容iOS 11+)

这是苹果官方推荐的批量更新替代方案,传入空的变更块即可触发全量高度重计算,完全不会修改cell内的现有内容:

// Swift 代码
self.tableView.performBatchUpdates(nil, completion: nil)
// Objective-C 代码
[self.tableView performBatchUpdates:nil completion:nil];

方案2:局部刷新指定行(仅需更新部分行高度时使用)

如果只需要调整少量cell的高度,调用reloadRows时指定.none动画,系统只会重计算高度,不会触发cell内容复用重置:

// Swift 代码,刷新指定indexPath对应的行
self.tableView.reloadRows(at: [targetIndexPath], with: .none)

注意:此方案仅适合cell复用逻辑稳定的场景,优先选择方案1

方案3:全版本兼容兜底方案

如果需要同时兼容iOS 11以下的系统版本,可以搭配原有逻辑做版本判断:

if #available(iOS 11.0, *) {
    self.tableView.performBatchUpdates(nil, completion: nil)
} else {
    self.tableView.beginUpdates()
    self.tableView.endUpdates()
}

内容的提问来源于stack exchange,提问作者Viktoria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:36:01