UITableView删除行时提示尝试删除重载同一indexPath错误如何解决
问题根因
报错是因为你对同一个索引路径(indexPath)同时触发了删除操作和 reload 操作,两个操作产生了校验冲突。
代码中的问题点
- 调用
totTableView.deleteRows(at: [indexPath], with: .automatic)之后立刻执行了totTableView.reloadData():deleteRows 会先把对应 indexPath 标记为待删除,此时立刻执行全局 reload 会触发数据源校验,系统会识别到你既要删除该 indexPath 又要加载该 indexPath 对应的行,直接抛出异常。 - 数据源判断逻辑存在混淆:你删除操作修改的是
displayList数组,但判断条件用的是displayTotList的计数,如果你没有同步更新这两个数组,会进一步导致数据源和UI操作不匹配,加重冲突问题。
修复方案
- 首先确认你绑定到UITableView的数据源是哪一个数组,修改和计数判断都要使用同一个数组,不要混用不同数组的属性
- 执行deleteRows之后不需要立刻调用全局reloadData,deleteRows本身就会触发对应区域的UI更新和动画,不需要额外全局刷新
- 如果删除行之后需要更新其他区域的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
相关产品推荐
相关产品推荐

