免责声明:我是一名Android开发人员,但为了一个KMM项目,我不得不深入研究Swift。
我有一个ViewModel设置如下:
class MyViewModel:ObservableObject {
...
var items Array = [Item]()
//the above array gets populated later on. Tried setting it as a state variable to be observed but for some reason the values never got updated
...
}
我已经能够从我的内容视图访问MyViewModel的一些其他变量(它位于结构范围之外的文件),如下所示:
struct ContentView: View {
@ObservedObject private (set) var viewmodel: MyViewModel
var body: some View {...}
...
}
然而,当我尝试从另一个结构访问MyViewModel变量时,另一个文件中包含的设置类似:
struct TestView {
@ObservedObject private var viewmodel = MyViewModel()
var body: some View {
var cartItems = viewmodel.itemsArray
}
}
,XCode显示在作用域中找不到类型"MyViewModel">
有没有一种方法可以像在Android/Kotlin中那样在swift上的多个视图之间共享ViewModel?
EDIT:刚刚意识到ViewModel包含在extension ContentView {}
中,因为它使用了扩展中的一些枚举。有没有一种方法可以按原样访问变量,或者我必须更改代码结构?这在swift中是如何工作的?
我认为它可能适用于
final class ViewModel: ObservableObject {
@Published var items = [Item]()
}
如果发生某些更改,@Published
修饰符将通知body属性。
然后,如果你想共享你的ViewModel,你必须创建";真理之源";有些人必须拥有自己的实例。
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {...}
}
这里@StateObject
创建ViewModel的新实例,您可以共享它
struct TestView {
@ObservedObject var viewModel: ViewModel()
var body: some View {
}
}
@ObservedObject
期望从其他接收ViewModel实例
在MyViewModel
&移除空间。发布该变量以便更新视图:
@Published var itemsArray = [Item]()
也不要向View body
添加变量,它应该只包含与View
相关的元素。
因此删除var cartItems = viewmodel.itemsArray
&而是直接使用CCD_ 9。您不需要新的变量。
注意:如果您的应用程序是iOS 14+
,请将@StateObject
替换为@ObservedObject
。