有人知道为什么这段代码会导致致命错误:当我试图从列表中删除一个项目时,索引超出范围?目前,我能够创建更多的文本字段并填充它们,但无法删除任何没有应用程序崩溃。
import SwiftUI
struct options: View {
@State var multiOptions = [""]
var body: some View {
VStack {
List {
ForEach(multiOptions.indices, id: .self) { index in
TextField("Enter your option...", text: $multiOptions[index])
}
.onDelete(perform: removeRow)
}
Button {
multiOptions.append("")
} label: {
Image(systemName: "plus.circle")
}
}
}
func removeRow(at offsets: IndexSet) {
multiOptions.remove(atOffsets: offsets)
}
}
下面是使用自定义绑定的答案:
struct ContentView: View {
@State var multiOptions = [""]
var body: some View {
VStack {
List {
ForEach(multiOptions.indices, id: .self) { index in
TextField("Enter your option...", text: Binding(get: { return multiOptions[index] },
set: { newValue in multiOptions[index] = newValue }))
}
.onDelete(perform: removeRow)
}
Button {
multiOptions.append("")
} label: {
Image(systemName: "plus.circle")
}
}
}
func removeRow(at offsets: IndexSet) {
multiOptions.remove(atOffsets: offsets)
}
}
这似乎很难让人相信,但很明显,将实体中的属性命名为"id"是导致这种行为的原因。我将UUID属性的名称更改为"myid";这些删除现在起作用了。列表视图仍然不能在预览中工作,但它现在可以在模拟器和设备中工作。