【问题标题】:How to fix Fatal error: Index out of Range如何修复致命错误:索引超出范围
【发布时间】:2020-06-01 10:13:06
【问题描述】:

在我的多维列表中,当我尝试删除行时遇到问题 - 线程 1:致命错误:索引超出范围:

struct Parent: Identifiable {
    let id = UUID()
    let name: String
    var children: [Child]?
}

struct Child: Identifiable {
    let id = UUID()
    let name: String
}

class AppState: ObservableObject {
    @Published var parents: [Parent]
    init() {
        self.parents = [
            Parent(name: "Foo", children: [Child(name: "bar")]),
            Parent(name: "FooBar", children: nil)
        ]
    }
}

struct ContentView: View {
    @EnvironmentObject var appState: AppState
    var body: some View {
        NavigationView {
            List {
                ForEach (0..<appState.parents.count) { parentIndex in
                    NavigationLink (destination: ChildrenView(parentIndex: parentIndex).environmentObject(self.appState)) {
                        Text(self.appState.parents[parentIndex].name) // Thread 1: Fatal error: Index out of range
                    }
                }
                .onDelete(perform: deleteItem)
            }
        }
    }
    private func deleteItem(at indexSet: IndexSet) {
        self.appState.parents.remove(atOffsets: indexSet)
    }
}

struct ChildrenView: View {
    @EnvironmentObject var appState: AppState
    var parentIndex: Int
    var body: some View {
        List {
            ForEach (0..<(appState.parents[parentIndex].children?.count ?? 0)) { childIndex in
                Text(self.appState.parents[self.parentIndex].children![childIndex].name)
            }
        }
    }
}

我重建了这种情况,因为我在一个包含更多代码的更大项目中遇到了这个问题。特别是当我尝试删除有孩子的父母时,我在儿童视图中遇到了问题。对于没有孩子的父母,我可以删除它们。 在这段代码中,我根本无法删除一行。

我认为这个问题在某种程度上与 parentIndex 相关,而 parentIndex 在通过可观察对象更改重新加载视图时并未减少。

【问题讨论】:

  • 一再重复...stackoverflow.com/…
  • 谢谢 - 这意味着 ForEach(Range) 是恒定的 - 当我将其更改为 ForEach (appState.parents) 时,我如何访问索引?
  • 知道了:ForEach (appState.parents.indices, id: \.self) { parentIndex in。感谢您的参考。

标签: swift swiftui observableobject


【解决方案1】:

出现此问题的原因是 foreach 循环中的范围是恒定的。必须改为:

ForEach (appState.parents.indices, id: \.self) { parentIndex in

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多