1

我对 IOS 开发很陌生,所以如果我以完全不正确的方式使用了代码,请多多包涵。

我使用 swiftui 2,我的问题是我的数据结构中有一个数组,其中包含我想通过 ForEach 在另一个视图中呈现的信息。到目前为止,这是可行的,但是如果我在其中一个子视图中更改数组,那么我会得到一个index out of range error

这是示例数据结构

struct Test  {
    var id: String
    var array : Array<String>
}

环境对象:

class DBhandler: ObservableObject {
    
    @Published var arrays: Test
    
    init(arrays: Test) {
        self.arrays = arrays
    }
}

应用程序文件

@main
struct DummyApp: App {
    @ObservedObject var dbhandler = DBhandler(arrays: Test(id: "1", array: ["Car", "Bus", "Train"]))
    
    var body: some Scene {
        WindowGroup {
            ContentView().environmentObject(dbhandler)
        }
    }
}

视图

struct ContentView: View {
    @EnvironmentObject var dbhandler: DBhandler
    
    var body: some View {

        VStack{
            ForEach(dbhandler.arrays.array.indices, id: \.self) {index in
                SubView(index: index)
            }
        }
        
    }
}

子视图

struct SubView : View {
    @EnvironmentObject var dbhandler: DBhandler
    
    let index: Int
    var body: some View {
        VStack{
            Text(dbhandler.arrays.array[index]) <--- here's the index out of range error
            Button(action: {
                dbhandler.arrays.array.remove(at: index)
            }, label: {
                Text("Remove object")
            })
        }

    }
}

我的假设是 ForEach 不是指最新的 dbhandler.arrays.array.indices 而是指旧的存储但我不知道如何规避它。

你们中有人知道我该如何解决这个问题吗?

任何帮助深表感谢 :)

4

2 回答 2

2

对于任何有同样问题的人。我已经找到了实现它的方法。由于ForEach存储原始数组并且不引用原始数组,因此可能的解决方法是强制ForEach更新自身。你可以这样做:

struct ContentView: View {
    @EnvironmentObject var dbhandler: DBhandler
    @State var dummyVar : Int = 0

    var body: some View {

        VStack{
            ForEach(dbhandler.arrays.array.indices, id: \.self) {index in
                SubView(index: index, dummyVar : dummyVar)
            }.id(dummyVar)
        }
        
    }
}

在 SubView 中,您只需将 dummyVar 增加 1。

于 2021-01-25T16:02:56.470 回答
0

您可以通过在 SubView index < dbhandler.arrays.array.count中添加检查来修复崩溃,如果索引超出范围,则不会呈现 View

struct SubView : View {
    @EnvironmentObject var dbhandler: DBhandler

    let index: Int
    var body: some View {
    VStack{
        if index < dbhandler.arrays.array.count{
            Text(dbhandler.arrays.array[index]) //<--- here's the index out of range error
            Button(action: {
                dbhandler.arrays.array.remove(at: index)
            }, label: {
                Text("Remove object")
            })
            
            }
        }

    }
}

在此处输入图像描述

于 2021-01-12T12:52:50.290 回答