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
相关产品推荐
相关产品推荐

