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

Core Data编辑视图中如何获取待删除实体的IndexSet?

解决方法

你完全没必要通过IndexSet来删除原实体——既然已经把目标实体item传入了编辑视图,直接操作这个实体本身就行,根本不需要依赖列表的索引。

1. 重构删除函数(更灵活的方式)

把原来依赖IndexSet的删除逻辑改写成直接接收实体的版本:

func deleteRound(_ entity: YourRoundEntity) {
    managedObjectContext.delete(entity)
    // 保存上下文(如果你的列表数据没有自动监听上下文变更)
    do {
        try managedObjectContext.save()
    } catch {
        print("删除实体出错: \(error.localizedDescription)")
    }
}

注意把YourRoundEntity替换成你实际的Core Data实体类型。

2. 在编辑视图中操作删除

在编辑视图执行保存操作前,直接传入原item调用删除函数,或者直接用上下文删除:

// 编辑视图里的保存方法
func saveChanges() {
    // 先删除原实体
    managedObjectContext.delete(item)
    
    // 创建新实体并赋值(如果你的逻辑是替换而非更新原数据)
    let newRound = YourRoundEntity(context: managedObjectContext)
    newRound.date = editedDate
    newRound.score = editedScore
    // ... 设置其他编辑后的属性
    
    // 保存上下文
    do {
        try managedObjectContext.save()
        // 保存完成后返回列表页
        navigationController?.popViewController(animated: true)
    } catch {
        print("保存失败: \(error.localizedDescription)")
    }
}

额外建议:其实不需要删除原实体

如果你的需求只是编辑原数据,而非替换成全新实体,那直接修改原item的属性再保存就行,这样不会产生重复条目,更符合Core Data的设计逻辑:

func saveChanges() {
    // 直接修改原实体的属性
    item.date = editedDate
    item.score = editedScore
    // ... 其他属性修改
    
    do {
        try managedObjectContext.save()
        navigationController?.popViewController(animated: true)
    } catch {
        print("保存失败: \(error.localizedDescription)")
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:32:47