gpt4 book ai didi

list - SwiftUI onDelete 列表与切换

转载 作者:行者123 更新时间:2023-12-04 17:26:30 30 4
gpt4 key购买 nike

这是我在这个问题上的第三个问题。到目前为止,还没有不崩溃的解决方案。我想在带有切换的列表上滑动删除。我的(简化的)代码如下所示:

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.enumerated() 并遍历索引。 func selectedItem() 的解决方案来自 https://troz.net/post/2019/swiftui-data-flow/ ,这是从 item 获取 Bindable 的好主意。

如果我尝试滑动删除列表项,我总是会收到此错误:

Thread 1: Fatal error: Index out of range

我真的很想了解为什么会发生这种情况,但 XCodes 错误消息并没有真正帮助。我在这里发布了类似的问题:SwiftUI ForEach with .indices() does not update after onDelete (见评论)和这里:SwiftUI: Index out of range when deleting cells with toggle .

我真的希望有人能在这个问题上提供帮助,因为几天来我试图在互联网上找到解决方案,但没有一个建议的解决方案真正适合我。

谢谢,尼科

最佳答案

这是固定的部分代码(使用 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})
}

关于list - SwiftUI onDelete 列表与切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62948754/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com