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

UITableView删除行时提示尝试删除重载同一indexPath错误如何解决

问题根因

报错是因为你对同一个索引路径(indexPath)同时触发了删除操作和 reload 操作,两个操作产生了校验冲突。

代码中的问题点
  • 调用totTableView.deleteRows(at: [indexPath], with: .automatic)之后立刻执行了totTableView.reloadData():deleteRows 会先把对应 indexPath 标记为待删除,此时立刻执行全局 reload 会触发数据源校验,系统会识别到你既要删除该 indexPath 又要加载该 indexPath 对应的行,直接抛出异常。
  • 数据源判断逻辑存在混淆:你删除操作修改的是displayList数组,但判断条件用的是displayTotList的计数,如果你没有同步更新这两个数组,会进一步导致数据源和UI操作不匹配,加重冲突问题。
修复方案
  1. 首先确认你绑定到UITableView的数据源是哪一个数组,修改和计数判断都要使用同一个数组,不要混用不同数组的属性
  2. 执行deleteRows之后不需要立刻调用全局reloadData,deleteRows本身就会触发对应区域的UI更新和动画,不需要额外全局刷新
  3. 如果删除行之后需要更新其他区域的UI,可以等删除动画完成后再执行刷新操作,或者只刷新指定的行/分区,避免全局reload和局部操作冲突
修复后参考代码
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    guard editingStyle == .delete else { return }
    // 确保操作的是tableView绑定的同一个数据源
    let preCount = displayList.count
    displayList.remove(at: indexPath.row)
    // 数组元素减少符合预期再执行UI更新
    if displayList.count == preCount - 1 {
        // 仅执行删除行操作即可,不需要加reloadData
        tableView.deleteRows(at: [indexPath], with: .automatic)
        // 如果确实需要刷新其他内容,等删除动画完成后再执行,示例如下:
        // DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
        //     tableView.reloadData()
        // }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:48:02