这是我对这个问题的第三个问题。到目前为止还没有不崩溃的解决方案。我想用切换来滑动删除列表。我的(简化的)代码如下所示:
struct Item: Identifiable {
var id = UUID()
var isOn: Bool
}
struct ContentView: View {
@State var items = [Item(isOn: true) , Item(isOn: false), Item(isOn: false)]
var body: some View {
NavigationView {
List {
ForEach(items) {item in
Toggle(isOn: self.selectedItem(id: item.id).isOn)
{Text("Item")}
}.onDelete(perform: delete)
}
}
}
func delete(at offsets: IndexSet) {
self.items.remove(atOffsets: offsets)
}
func selectedItem(id: UUID) -> Binding<Item> {
guard let index = self.items.firstIndex(where: {$0.id == id}) else {
fatalError("Item does not exist")
}
return self.$items[index]
}
}
我尝试了不同的解决方案,例如和.indices
and .enumerated()
并循环索引。解决方案与func selectedItem()
来自https://troz.net/post/2019/swiftui-data-flow/,这是一个获得 Bindable 的好主意item
.
如果我尝试滑动删除列表项,我总是会收到此错误:
Thread 1: Fatal error: Index out of range
我真的很想了解为什么会发生这种情况,但是 XCodes 错误消息并没有真正的帮助。我在这里发布了类似的问题:带有 .indices() 的 SwiftUI ForEach 在 onDelete 后不会更新(见评论)和这里:SwiftUI:使用切换删除单元格时索引超出范围.
我真的希望有人可以帮助解决这个问题,因为我尝试在互联网上找到解决方案几天,但建议的解决方案都没有真正适合我。
谢谢,尼科
这是代码的固定部分(使用 Xcode 11.4 / iOS 13.4 测试)
func selectedItem(id: UUID) -> Binding<Item> {
guard let index = self.items.firstIndex(where: {$0.id == id}) else {
fatalError("Item does not exist")
}
// Don't use direct biding to array element as it is preserved and
// result in crash, use computable standalone binding instead !!
return Binding(get: {self.items[index]}, set: {self.items[index] = $0})
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)