从 SwiftUI 中的分组(按字典)列表中删除 CoreData 对象

问题描述 投票:0回答:1

我在分组列表上使用“滑动删除”时遇到问题,因为它会随机删除错误的对象。据我所知,这来自(分组)列表索引与 CoreData 中对象的索引不匹配。不幸的是我不知道如何传递正确的索引。

有人有正确方向的提示吗?

提前非常感谢!

这是我的列表视图以及分组功能:

  ForEach(sectionDataCategory()) { section in
                        Section {
                            ForEach(section.notes) { note in
                                NavigationStack {
                                    NavigationLink {
                                        EditNotesView(projects: projects, note: note)
                                    } label: {
                                        Text(note.name ?? "")
                                    }
                                }
                            }.onDelete(perform: deleteNotes)
                        } header: {
                            Text(section.name )
                        }
                    }
  func sectionDataCategory() -> [NotesSection] {
        let dictByCategory = Dictionary(grouping: projects.notesArray, by: { $0.category })
        var completedSectionData = [NotesSection]()
        for key in dictByCategory.keys {
            completedSectionData.append(NotesSection(name: key ?? "", notes: dictByCategory[key]!))
        }
        return completedSectionData.sorted()
    }
    struct NotesSection: Identifiable, Hashable, Comparable {
        static func < (lhs: NotesListView.NotesSection, rhs: NotesListView.NotesSection) ->    Bool {
            lhs.name < rhs.name
        }
        
        var id: Int { hashValue }
        let name: String
        let notes: [Notes]
    }

我尝试了不同的方法来计算正确的索引,例如firstIndex(where:)方法。我现在不确定这是否适用于 CoreData

编辑:正如评论中已经指出的那样,我在这里没有使用SectionedFetchRequests。这里的注释是使用一对多关系的项目实体的子实体。不幸的是,建议的解决方案不起作用......

dictionary swiftui core-data delete-row
1个回答
0
投票

您需要使用谓词

@FetchRequest
为您的
@SectionedFetchRequest
实体执行另一个
Note
"project = %@"
,恐怕这是唯一的方法。

@ObservedObject var project: Project

var body: some View {
    let _ = updatePredicate()
    ForEach(notes) {
        ...
}

func updatePredicate(){
    notes.predicate = NSPredicate("project = %@", project)
}
© www.soinside.com 2019 - 2024. All rights reserved.