我在分组列表上使用“滑动删除”时遇到问题,因为它会随机删除错误的对象。据我所知,这来自(分组)列表索引与 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。这里的注释是使用一对多关系的项目实体的子实体。不幸的是,建议的解决方案不起作用......
您需要使用谓词
@FetchRequest
为您的 @SectionedFetchRequest
实体执行另一个 Note
或 "project = %@"
,恐怕这是唯一的方法。
@ObservedObject var project: Project
var body: some View {
let _ = updatePredicate()
ForEach(notes) {
...
}
func updatePredicate(){
notes.predicate = NSPredicate("project = %@", project)
}