.onDelete на ForEach, вложенный в другой ForEach - PullRequest
0 голосов
/ 05 февраля 2020

Я работаю над проектом, чтобы облегчить жизнь учителей, когда дело доходит до отметок, процентов, записей, профилей учеников ... Пока все хорошо, за исключением того, что я не смог правильно удалить базовые данные с помощью '.onDelete «потому что я выставляю предметы по группам вначале , затем показывают себя, как изображение, связанное здесь .

Я пытался применить« .onDelete »к внешний 'ForEach', но его поведение одинаково ошибочно c, и я не могу понять, как передать ему правильный IndexSet.

Список вещей, которые необходимо уточнить (надеюсь):

  • 'Subject' - моя единственная сущность CoreData.
  • 'readableGrade' - простая функция, которая возвращает String из значения 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)
            }
        }
    }
}
...