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

Swift Core Data 一对多关系场景下如何删除 TableView 中的行?

错误原因

  • 你当前的删除操作仅移除了临时数组itemsOnListArray里的元素,这个数组是itineraries的拷贝,修改它不会真正改变Core Data中存储的待办数据,也不会更新myFetchRCTripName关联的itineraries集合
  • 调用tableView.deleteRows后,UITableView会校验数据源的行数是否和删除后的预期一致,此时myFetchRCTripName?.itineraries?.count还是原来的数值,和删除后预期的行数不匹配,就会抛出Invalid update错误

修复方案

把commit editingStyle方法替换为以下代码:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    guard editingStyle == .delete,
          let itineraries = myFetchRCTripName?.itineraries?.allObjects as? [Itinerary],
          indexPath.row < itineraries.count else {
        return
    }
    // 1. 从Core Data上下文删除待办对象
    let toDeleteItem = itineraries[indexPath.row]
    CoreDataStack.shared.persistentContainer.viewContext.delete(toDeleteItem)
    // 2. 保存上下文更改,此时myFetchRCTripName的itineraries会自动更新
    CoreDataStack.shared.saveContext()
    // 3. 同步删除TableView对应行
    tableView.deleteRows(at: [indexPath], with: .automatic)
}

可选优化建议

如果后续列表频繁增删,推荐使用NSFetchedResultsController来监听Core Data的变化,自动同步更新TableView,无需手动处理数据和列表的一致性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:27:01