【发布时间】:2021-11-30 13:21:20
【问题描述】:
有谁知道为什么这段代码会导致致命错误:当我尝试从列表中删除项目时,索引超出范围?目前,我能够创建更多文本字段并填充它们,但无法在应用程序崩溃的情况下删除任何内容。
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)
}
}
【问题讨论】:
-
按照我之前的回答,不要使用
@State。 SwiftUI 视图是结构体,因此是不可变的,因此在需要更新时会重新创建它们。使用单独的模型对象来保存您的数组@StateObject -
-
为了您的信息,您的代码原样在 macos 12.beta9、xcode 13.beta5(未发布)、针对 ios 15 和 macCatalyst 12 上运行良好。在真实设备上测试。在旧系统上可能会有所不同。但是,我建议您重新构建代码,并使用已经提到的建议。