SwiftUI Thread 1: Неустранимая ошибка: индекс вне допустимого диапазона
Я получаю сообщение об ошибке при удалении строки в SubView1
в следующем коде.
class Model: ObservableObject {
@Published var items: [Item]
init(name: String, items: [Item]) {
self.items = items
}
func delete(at offsets: IndexSet) {
self.items.remove(atOffsets: offsets)
}
}
class Item: Identifiable, ObservableObject, Equatable {
static func == (lhs: Item, rhs: Item) -> Bool {
return lhs.id == rhs.id
}
var id = UUID()
var itemName: String
@Published var subItems: [SubItem]
init(itemName: String, payments: [SubItem]) {
self.itemName = itemName
self.subItems = payments
}
func delete(at offsets: IndexSet) {
self.subItems.remove(atOffsets: offsets)
}
}
class SubItem: Identifiable, ObservableObject, Equatable {
static func == (lhs: SubItem, rhs: SubItem) -> Bool {
return lhs.id == rhs.id
}
var id = UUID()
var isOn: Bool
init(isOn: Bool) {
self.isOn = isOn
}
}
struct MainView: View {
@EnvironmentObject var model: Model
var body: some View {
NavigationView {
List {
ForEach(model.items) {item in
NavigationLink(destination: SubView1(item: self.$model.items[self.model.items.firstIndex(of: item) ?? 0])) {
HStack{
Text(item.itemName)
ForEach(item.subItems) {subItem in
Text(subItem.isOn ? "True": "False")
}
}
}
}.onDelete(perform: model.delete)
}
}
}
}
// Here ------>
struct SubView1: View {
@Binding var item: Item
var body: some View {
List {
ForEach(0..<item.subItems.count) {index in
NavigationLink(destination: SubView2(subItem: self.$item.subItems[index])) {
ToggleView(subItem: self.$item.subItems[index])
}
}.onDelete(perform: item.delete)
}
}
}
struct SubView2: View {
@Binding var subItem: SubItem
var body: some View {
Toggle(isOn: $subItem.isOn) {
Text("Toggle-Text")
}
}
}
struct ToggleView: View {
@Binding var subItem: SubItem
var body: some View {
Toggle(isOn: $subItem.isOn) {
Text("Toggle-Text")
}
}
}
Ошибка:
Thread 1: Fatal error: Index out of range
Я также пробовал другой код для SubView1
:
struct SubView1: View {
@Binding var item: Item
var body: some View {
List {
ForEach(item.subItems) {subItem in
NavigationLink(destination: SubView2(subItem: self.$item.subItems[self.item.subItems.firstIndex(of: subItem) ?? 0])) {
ToggleView(subItem: self.$item.subItems[self.item.subItems.firstIndex(of: subItem) ?? 0])
}
}.onDelete(perform: item.delete)
}
}
}
Почему это?
1 ответ
К сожалению, ваш код не компилируется, и мне не хочется искать ошибки. -> Предоставьте пример компиляции и выполнения, чтобы мы могли фактически попробовать решить проблему, а не сначала решать проблемы компиляции. Как создать минимальный воспроизводимый пример
В общем, я бы рекомендовал вам никогда не выполнять действия с массивами с пустыми индексами. Особенно те, которые, как вы знаете, изменяются во время выполнения. По крайней мере, проверьте их, прежде чем выполнять действие. Используйте прямые индексы только тогда, когда массив является окончательным, иначе риск выхода из диапазона индекса слишком высок.
Для тебя onDelete
попробуйте использовать такой метод:
List {
ForEach(listItems, id: \.self) { (item) in
Text(item)
}.onDelete { (indexSet) in
self.listItems.remove(atOffsets: indexSet)
}
}
Подробнее об этом здесь: Удалить элемент списка с помощью SwiftUI
Чтобы не выполнять действия с индексами, которые небезопасны, попробуйте что-то вроде этого:
if let index = self.myData.firstIndex(of: self.item) {
self.myData.remove(at: index)
}
подробнее об этом здесь: Удаление из массива - Неустранимая ошибка: Индекс вне диапазона - Связывание SwiftUI