首页 > 解决方案 > 在视图模型中使用数组

问题描述

我在视图模型中有一个数组。我无法弄清楚如何使用虚拟数据对其进行初始化,以便以后可以访问数组的任何元素。每次加载视图时,数组中的元素数量都会发生变化,因此我无法在视图模型中使用“重复”对其进行初始化。

我尝试从 .onAppear 调用一个函数以将元素附加到数组中,但 .onAppear 似乎在我的视图加载后运行,因此尝试访问数组时出现错误。

我显然做错了,

我的视图模型是:

class DemoViewModel: ObservableObject {
    
    @Published var array = [0]
    
}

我的看法是:

@ObservedObject private var demoViewModel = DemoViewModel()

// This changes every time the view is called from it's parent
var numberOfItemsInArray = 10

var body: some View {
    List(0..<numberOfItemsInArray) { index in
        Text("Hello, World! - \(index)")
       //     demoViewModel.array[index] = 1
       // causes an error
    }
}

标签: arraysmvvmswiftui

解决方案


您可以将numberOfItemsInArray变量传递给DemoViewModelinit,因此您可以使用Array(repeating:count:)

class DemoViewModel: ObservableObject {
    @Published var array: [Int]

    init(numberOfItemsInArray: Int) {
        array = Array(repeating: 0, count: numberOfItemsInArray)
    }
}

并像这样初始化DemoViewModel

struct ContentView: View {
    @ObservedObject private var demoViewModel: DemoViewModel

    init(numberOfItemsInArray: Int = 10) {
        demoViewModel = DemoViewModel(numberOfItemsInArray: numberOfItemsInArray)
    }

    var body: some View {
        List(0 ..< demoViewModel.array.count) { index in
            Text("Hello, World! - \(index)")
        }
    }
}

另外,如果您使用的是 SwiftUI 2 ,请考虑使用@StateObject而不是。@ObservedObject


推荐阅读