SwiftUI 似乎有一个相当烦人的限制,这使得很难创建一个List或一段ForEach时间来绑定到每个元素以传递给子视图。
我见过的最常建议的方法是迭代索引,并获得与的绑定$arr[index](事实上,当他们删除的一致性时,Apple 提出了类似的建议):BindingCollection
@State var arr: [Bool] = [true, true, false]
var body: some View {
List(arr.indices, id: \.self) { index in
Toggle(isOn: self.$arr[index], label: { Text("\(idx)") } )
}
}
Run Code Online (Sandbox Code Playgroud)
这一直有效,直到数组的大小发生变化,然后它因索引超出范围运行时错误而崩溃。
这是一个会崩溃的例子:
class ViewModel: ObservableObject {
@Published var arr: [Bool] = [true, true, false]
init() {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.arr = []
}
}
}
struct ContentView: View {
@ObservedObject …Run Code Online (Sandbox Code Playgroud) 我有一个ForEach块和一个Stepper嵌入在List视图中。List视图第一部分的内容如下:
ForEach(record.nodes.indices, id: \.self) { index in
HStack {
TextField("X", text: self.$record.nodes[index].xString)
Spacer()
Divider()
TextField("Y", text: self.$record.nodes[index].yString)
Spacer()
}
}
Stepper("± node", onIncrement: {
self.record.nodes.append(Node(x: 0, y: 0))
}, onDecrement: {
self.record.nodes.removeLast()
})
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,在调用 时self.record.nodes.removeLast(),应用程序因Index out of range错误而崩溃。我一直试图解决这个问题几个小时,但无济于事。
我最初使用onDelete,但是产生了同样的问题。
该项目可以在https://github.com/jacobcxdev/Timekeeper找到,此错误发生在RecordDetailView.swift 中。