在Swiftui中共享ViewModel



免责声明:我是一名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

最新更新