【问题标题】:SwiftUI ForEach with .indices() does not update after onDelete带有 .indices() 的 SwiftUI ForEach 在 onDelete 之后不会更新
【发布时间】:2020-11-04 15:20:25
【问题描述】:

我的问题是:我有一些包含一些项目的简单数组。我想使用带有ForEach.indices()ForEach 显示带有这些项目的List。 (这是因为我在List 中处理Toggle 的实际问题,对于isOn 绑定,我需要索引来处理绑定到EnvironmentObject 的模型)。所以循环数组items的解决方案对于我的问题是不可能的。

简化的起点如下所示:

struct ContentView: View {
    @State var items = ["Item1", "Item2", "Item3"]
    
    var body: some View {
        List {
            ForEach(items.indices) {index in
                Text(self.items[index])
            }.onDelete(perform: deleteItem)
        }
    }
    
    func deleteItem(indexSet: IndexSet) {
        self.items.remove(atOffsets: indexSet)
    }
}

如果我现在尝试滑动删除一行,我会收到以下错误消息:

Thread 1: Fatal error: Index out of range

调试闭包内的index 值,我可以看到items-array 的索引没有更新。例如:如果我用"Item 1" 删除第一行并在删除该行后检查index 的值,它将返回2 而不是0(这是预期的数组的第一个索引)。为什么会这样?我该如何解决这个问题?

感谢您的帮助!

【问题讨论】:

    标签: swiftui indices


    【解决方案1】:

    只用动态内容ForEach构造函数(_ data: .., id: ...)

    ForEach(items.indices, id: \.self) {index in   // << here !!
        Text(self.items[index])
    }.onDelete(perform: deleteItem)
    

    【讨论】:

    • 感谢您的回答,阿斯佩里。它运作良好。现在,我使用具有[Item] 数组的Model-class 尝试了您的解决方案。而Item 是一个符合Identifiable 并具有布尔属性的结构。现在,如果我像上面一样构建相同的视图,一切都很好。但是当我用由布尔值控制的Toggle() 替换Text()-View 时,我在删除时遇到另一个错误(这次在AppDelegate 内):Thread 1: Fatal error: Index out of range。这里会发生什么?
    • 这解决了我的问题......使用传统方法,在第一个视图中加载我的数组有 3 个元素,并显示 3 个项目......在重新加载时,数组有一个项目,但 ForEach 遍历索引 0、1、2。即使我冷检查 items.count 并且它是 = 1,就在 ForEach 之前......奇怪......
    猜你喜欢
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多