Я пытаюсь реализовать динамический 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