在ForEach上的.onDelete嵌套在另一个ForEach中

时间:2020-02-04 23:16:50

标签: core-data swiftui swiftui-environment

我正在一个项目上,以期在分数,百分比,记录,学生档案等方面,使教师的生活变得更加轻松……到目前为止,很好,除了我无法使用'.onDelete正确删除核心数据',因为我将科目设置为按年级分组,然后先然后展现自己,就像image linked here

我尝试将'.onDelete'应用于外部的'ForEach',但是其行为同样不稳定,而且我无法弄清楚如何将其正确传递给IndexSet。

希望澄清的事情清单:

  • “主题”是我唯一的CoreData实体。
  • 'readerGrade'是一个简单的函数,可从Int值返回字符串。

我认为'.onDelete'使用要在主视图中删除的实体的位置作为创建顺序中的实体位置来删除我的实体。我的意思是,如果我选择删除显示的最后一个,“。onDelete”将删除最新的,如果我选择显示的第一个,它将删除最旧的。

谢谢!

import SwiftUI

struct SubjectsSortedByGrade: View {
    @Environment(\.managedObjectContext) var moc
    var subjects: FetchedResults<Subject>

    var grades: [Int : [Subject]] {
        Dictionary(
            grouping: subjects,
            by: { Int($0.grade) }
        )
    }

    func filterByGrade(_ value: Int) -> [Subject] {
        var filteredSubjects = [Subject]()
        for subject in subjects {
            switch Int(subject.grade) {
            case value:
                filteredSubjects.append(subject)
            default:
                break
            }
        }
        return filteredSubjects
    }

    func removeSelectedSubjects(at offsets: IndexSet) {
        for offset in offsets {
            let subject = subjects[offset]
            moc.delete(subject)
        }
        try? moc.save()
    }

    var body: some View {
        ForEach(grades.keys.sorted(), id: \.self) { grade in
            Section(header: Text(readableGrade(grade))) {
                ForEach(self.filterByGrade(grade), id: \.id) { subject in
                    Text(subject.name ?? "Desconocido")
                }.onDelete(perform: self.removeSelectedSubjects)
            }
        }
    }
}

0 个答案:

没有答案