Удалить элемент списка в разделе с SwiftUI и SwiftDataIOS

Программируем под IOS
Ответить
Anonymous
 Удалить элемент списка в разделе с SwiftUI и SwiftData

Сообщение Anonymous »

У меня есть типичный список с разделами, и я хочу удалить элементы списка. Элементы, из которых формируются разделы, взяты из SwiftData/CloudKit.
@Query(sort: [SortDescriptor(\BoughtItem.boughtDate, order: .reverse)])
private var allItems: [BoughtItem]

Разделы находятся в вычисляемой переменной. По сути, это элементы, сгруппированные по дате:
var sections: [HistorySection] {
toSections(items: allItems)
}

При удалении элемента возникает ошибка:

Swift/ContigiousArrayBuffer.swift:675: Неустранимая ошибка: Индекс вне диапазона

при последующем обновлении пользовательского интерфейса при доступе к разделу по его индексу:
Text(sections[sectionIndex].date.description)

Есть идеи? как предотвратить рассинхронизацию запроса и данных пользовательского интерфейса? вот более полный код:
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)")
}
}
}
}



Подробнее здесь: https://stackoverflow.com/questions/793 ... -swiftdata
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»