我有以下代码,它只能在 Xcode 13 beta 中编译,而不是在 Xcode 12 中编译。该项目针对 iOS 13 及更高版本。请注意,它使用可以将绑定传递给数组元素的新语法,这是我在项目中需要的(但此演示代码可以不用)。
class MyViewModel: ObservableObject {
@Published var model: MyModel
init() {
self.model = MyModel(components: ["alpha", "bravo", "charlie", "delta", "echo", "foxtrot"])
}
}
struct MyModel {
var components: [String]
}
struct ContentView: View {
@EnvironmentObject var viewModel: MyViewModel
var body: some View {
NavigationView {
Form {
Section(header: Text("Components")) {
ForEach(self.$viewModel.model.components, id: \.self) { $component in
Text(component)
}
.onDelete(perform: delete)
}
}
}.navigationViewStyle(StackNavigationViewStyle())
}
private func delete(_ indices: IndexSet) {
for index in indices {
self.viewModel.model.components.remove(at: index)
}
}
}
此外, ContentView() 必须注入正确的环境对象,即:
struct FormDeleteCrashDemo_iOS13App: App {
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(MyViewModel())
}
}
}
在运行 iOS 14 的 iPad 或 iPhone 上运行此代码时,用户可以向左滑动删除。删除最下面一行就可以了。删除任何其他行将崩溃并出现以下错误:
Swift/ContiguousArrayBuffer.swift:580: Fatal error: Index out of range
当我用 替换Form
时List
,不会发生崩溃。为什么?