SwiftUI: «Неустранимая ошибка: индекс выходит за пределы диапазона» после удаления последнего элемента списка и переключения на другой вид вкладки - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь реализовать динамический c созданный список в виде вкладок в SwiftUI, используя EnvironmentObject и Binding (что может не потребоваться в приведенном ниже примере кода, но в моем реальном проекте) для SubView объекта строка.

Сам список (добавить элемент, удалить элемент) работает нормально, а также переключиться на другую «страницу» в представлении вкладок. Но если вы удаляете последний элемент списка, и только последний (если вы удаляете первый или любой элемент между ними, также работает нормально), приложение вылетает с ошибкой: «Поток 1: Неустранимая ошибка: Индекс из диапазон », как только вы пытаетесь переключиться на другую вкладку после удаления этого элемента.

Вот (пример) -код:

import SwiftUI

struct PickerRowData: Equatable, Identifiable, Hashable  {
    var id = UUID()
    var pickerValueString = ""
}

class GlobalStates: ObservableObject, Identifiable {
    @Published var pickerRowData = [PickerRowData]()

    var id = UUID()
}

struct MeasurePickerRow: View, Identifiable {
    @Binding var pickerRowData: PickerRowData
    var id = UUID()

    var body: some View {
        return VStack {
            Text("Just a test. ID: \(pickerRowData.id)")
        }
    }
}

struct MeasurePickerView: View {
    @EnvironmentObject var globalStates: GlobalStates

    var body: some View {
        return NavigationView {
            List {
                ForEach(self.globalStates.pickerRowData) { rowData in
                    MeasurePickerRow(pickerRowData: self.$globalStates.pickerRowData[self.globalStates.pickerRowData.lastIndex(of: rowData) ?? 0])
                }
                .onDelete(perform: deleteMeasurePicker)
            }
            .listStyle(GroupedListStyle())
            .padding(0)
            .navigationBarTitle(Text("Input"), displayMode: .inline)
            .navigationBarItems(
                trailing: HStack {
                    Button(action: {
                        self.globalStates.pickerRowData.append(PickerRowData())
                    }) {
                        Image(systemName: "gauge.badge.plus")
                    }
                })
        }
    }
    func deleteMeasurePicker(at offsets: IndexSet) {
        self.globalStates.pickerRowData.remove(atOffsets: offsets)
    }
}

struct ContentView: View {
    var body: some View {
        TabView {
            MeasurePickerView()
                .tabItem {
                    Image(systemName: "gauge")
                    HStack {
                        Text("Tab 1")
                    }
            }
            Text("Tab 2 View")
                .tabItem {
                    Image(systemName: "equal.circle")
                    HStack {
                        Text("Tab 2")
                    }
            }
        }
    }
}

Я что-то пропустил? Я довольно новичок в SwiftUI (и Swift), поэтому я надеюсь, что у кого-то есть подсказка.

С уважением, DZ

...