如何在 onDelete 中获取当前的 CoreData 项

Posted

技术标签:

【中文标题】如何在 onDelete 中获取当前的 CoreData 项【英文标题】:How to get current CoreData item in onDelete 【发布时间】:2020-06-02 13:46:23 【问题描述】:

有两个实体ParentChild,这是一对多的关系。一个父母和多个孩子。

我用EditMode删除Child这样的数据:

@ObservedObject private var db = CoreDataDB<Child>(predicate: "parent")

var body: some View 

    VStack 
        Form 

            Section(header: Text("Title")) 
                ForEach(db.loadDB(relatedTo: parent))  child in

                    if self.editMode == .active 
                        ChildListCell(name: child.name, order: child.order)
                     else 
                        ...
                    
                
                .onDelete  indices in 
                  // how to know which child is by indices here ???
                  let thisChild = child // <-- this is wrong!!!

                  self.db.deleting(at: indices)
                
            
        
    

deleting 方法在另一个类中定义,例如:

public func deleting(at indexset: IndexSet) 

    CoreData.executeBlockAndCommit 

        for index in indexset 
            CoreData.stack.context.delete(self.fetchedObjects[index])
        
    

onDelete 发生时,我还想更新ParentChild 实体的其他属性。 但我必须找到当前被删除的Child 项目。如何制作?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

这是可能的方法...(假设您的 .loadDB 返回数组,但通常类似的方法适用于任何随机访问集合)

使用 Xcode 11.4 测试(使用常规项目数组)

var body: some View 
    VStack 
        Form 
            Section(header: Text("Title")) 
                // separate to standalone function...
                self.sectionContent(with: db.loadDB(relatedTo: parent))
            
        
    


// ... to have access to shown container
private func sectionContent(with children: [Child]) -> some View 
    // now we have access to children container in internal closures
    ForEach(children)  child in

        if self.editMode == .active 
            ChildListCell(name: child.name, order: child.order)
         else 
            ...
        
    
    .onDelete  indices in

        // children, indices, and child by index are all valid here
        if let first = indices.first 
            let thisChild = children[first]       // << here !!
            // do something here
        

        self.db.deleting(at: indices)
    

【讨论】:

你能帮我检查一下问题***.com/questions/62860449/…。困扰我很久。还是谢谢。

以上是关于如何在 onDelete 中获取当前的 CoreData 项的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 .onDelete- 或如何在列表中逐行使用 .deleteDisabled?

SwiftUI .onDelete 从 ForEach 获取 var

在 Core Data 中获取 IndexSet

SwiftUI .onDelete 抛出致命错误:索引超出范围

SwiftUI - 如何在编辑模式下避免列表中的行缩进,但不使用 onDelete? (附代码/视频)

onDelete:在条目被删除之前从条目访问数据