arrays - 在视图模型中使用数组
问题描述
我在视图模型中有一个数组。我无法弄清楚如何使用虚拟数据对其进行初始化,以便以后可以访问数组的任何元素。每次加载视图时,数组中的元素数量都会发生变化,因此我无法在视图模型中使用“重复”对其进行初始化。
我尝试从 .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
}
}
解决方案
您可以将numberOfItemsInArray
变量传递给DemoViewModel
init,因此您可以使用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
推荐阅读
- java - 3 方式快速排序:线程“主”java.lang.StackOverflowError 中的异常
- java - WebfluxTest 和 MockBean
- python-3.x - 我不把它当作一个字符串,但 python 把它当作一个字符串
- date - 使用 Image::Exiftools 或 Date::Handler 创建日期
- r - 如何提取不同年份 3 月和 7 月之间月份的观测值和日期?
- django - django模型中的forien键
- java - 构造二叉树时处理重复项
- c - 服务器可以在c中打开两个TCP套接字吗?
- r - Pycharm IntelliJ R 扩展找不到 R 解释器
- python - 尝试从网站上抓取工作信息时,搜索结果之间的广告出现问题