Listenelement im Abschnitt mit SwiftUI und SwiftData löschen [Duplikat]IOS

Programmierung für iOS
Guest
 Listenelement im Abschnitt mit SwiftUI und SwiftData löschen [Duplikat]

Post by Guest »

Ich habe eine typische Liste mit Abschnitten und möchte Listenelemente löschen. Die Elemente, von denen die Abschnitte abgeleitet werden, stammen von SwiftData/CloudKit.

Code: Select all

@Query(sort: [SortDescriptor(\BoughtItem.boughtDate, order: .reverse)])
private var allItems: [BoughtItem]
Die Abschnitte befinden sich in einer berechneten Variablen. Dabei handelt es sich im Grunde um nach Datum gruppierte Elemente:

Code: Select all

var sections: [HistorySection] {
toSections(items: allItems)
}
Beim Löschen des Elements tritt ein Fehler auf:

Swift/ContiguousArrayBuffer.swift:675: Schwerwiegender Fehler: Index außerhalb des gültigen Bereichs

im nachfolgenden UI-Update, wenn auf den Abschnitt mit seinem Index zugegriffen wird:

Code: Select all

Text(sections[sectionIndex].date.description)
Irgendwelche Ideen? Wie verhindere ich, dass die Abfrage und die UI-Daten nicht mehr synchron sind? Hier ist der vollständigere Code:

Code: Select all

struct HistoryView: View {
@Environment(\.modelContext) private var modelContext

@Query(sort: [SortDescriptor(\BoughtItem.boughtDate, order: .reverse)])
private var allItems: [BoughtItem]

var sections: [HistorySection] {
toSections(items: allItems)
}

var body: some View {
NavigationStack {
List {
ForEach(sections.indices, id: \.self) { sectionIndex in
Section(header: HStack {
Text(sections[sectionIndex].date.description)
Spacer()
}) {
ForEach(sections[sectionIndex].boughtItems) { boughtItem in
HStack {
Text(boughtItem.name ?? "")
Spacer()
VStack {
Text(boughtItem.quantity.description)
Text(boughtItem.price.description)
}
}
}
.onDelete { indexSet in
deleteItem(in: sectionIndex, at: indexSet)
}
}
}
}
}
}

private func deleteItem(in sectionIndex: Int, at offsets: IndexSet) {
withAnimation {
let section = sections[sectionIndex]
print("will delete: " + sectionIndex.description + ", offsets: " + offsets.description)
for index in offsets {
let boughtItem = section.boughtItems[index]
modelContext.delete(boughtItem)

}

do {
try modelContext.save()
} catch {
print("error saving: \(error)")
}
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post