【问题标题】:SwiftUI @ObservedObect View Model Index out of RangeSwiftUI @ObservedObect 视图模型索引超出范围
【发布时间】:2021-01-16 07:10:29
【问题描述】:

在 Swift 中,我有一个连接到 FireStore 的 viewModel,当我调用它的函数 fetchData 时,它成功返回了许多文档。但是,当我尝试使用索引引用文档时,会出现超出范围错误。

在此示例中,文档数返回为 1,因此我看不出为什么下一个 Text 语句不起作用。会不会是时间问题?意思是,文档在那个时刻是否实际可用。

@ObservedObject var testViewModel = GetTestViewModel()

var body: some View {
    
    VStack {
        Text("Number of tests = \(testViewModel.test.count)") // Returns 1
        Text("Test Level = \(testViewModel.test[0].level)")
        // Allways crashes with Fatal error: Index out of range
        
    }
            .onAppear() {
        // This should and does return one record
        testViewModel.fetchdata(testId: "4Yv7iT2BjHCKNzr4umpG")
        LoadNewTest()
        
    }
}
func LoadNewTest() {
    print("Load Test")
    if !testViewModel.test.isEmpty {
        print("Number of tests = \(testViewModel.test.count)") // Never prints
    }
    
}

【问题讨论】:

    标签: swift swiftui observedobject


    【解决方案1】:

    count 为零时,您可能看不到对body 的第一个请求,因此最好明确添加条件,例如

    VStack {
        Text("Number of tests = \(testViewModel.test.count)") // Returns 1
    
        if !testViewModel.test.isEmpty {
           Text("Test Level = \(testViewModel.test[0].level)")
        }
    }
    

    【讨论】:

    • 效果很好,但是在我的真实应用中,我在 fetchdata 之后调用 onAppear 中的一个函数,使用 testViewModel 进行一些处理。如果我放入你的 !testViewModel.test.isEmpty 函数中的代码永远不会运行。
    • 看来我正在尝试在对象可用之前使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多