一个 ObservedObject 需要接受另一个 ObservedObject 作为参数;你怎么做到这一点?

Posted

技术标签:

【中文标题】一个 ObservedObject 需要接受另一个 ObservedObject 作为参数;你怎么做到这一点?【英文标题】:One ObservedObject needs to take in another ObservedObject as an argument; how do you do this? 【发布时间】:2020-05-31 15:44:38 【问题描述】:
struct ContentView 
    @ObservedObject var annotationsVM = AnnotationsVM()
    //I'd like to pass in the ViewModel() declared below into annotationsVM like AnnotationsVM(VModel: Vmodel)
    @ObservedObjects var VModel = ViewModel()

    var body: some View 
        //All the SwiftUI view setup is in here
    


class AnnotationsVM: ObservableObject 
    @ObservedObject var VModel = ViewModel()
    //I'd like to pass in the VModel in content view like: @ObservedObject var VModel: VModel

显然,我不能像我想要的那样在创建 ContentView 时直接传入 VModel,因为尚未创建 VModel 对象,所以它无法访问...

Recap:我想将在 ContentView 中声明的 VModel 实例传入 annotationsVM 实例(也在 ContentView 中声明)

【问题讨论】:

【参考方案1】:

您可以在init 中这样做:

struct ContentView 
    @ObservedObject var annotationsVM: AnnotationsVM
    @ObservedObject var vModel: ViewModel

    init() 
        let vm = ViewModel()
        vModel = vm
        annotationsVM = AnnotationsVM(vModel: vm)
    

    var body: some View 
        //All the SwiftUI view setup is in here
    


class AnnotationsVM: ObservableObject 
    var vModel: ViewModel

    init(vModel: ViewModel) 
        vModel = vModel
    

您只能在View 中使用@ObservedObject

注意:最好在 init 中将 ViewModels 作为参数传递以遵循Dependency Injection 模式。

【讨论】:

谢谢,我相信这会奏效...不过要明确一点,AnnotationsVM 类的初始化应该类似于 init(vModel: ViewModel) ,对吧? 抱歉,contentview 中的初始化不起作用...它表示您传递给 AnnotationsVM 的 vModel 有一个错误“在所有存储的属性初始化之前自行使用” 我更新了我的答案。现在有了let vm = ViewModel(),不应该出现任何无效使用self的错误。 有没有其他方法可以将参数传递给 ObservableObject?因为在每次父视图更新时,子视图都会重新初始化,ObservableObject内部的状态不会持久化。 @user12208004 您可以在父视图中使用@StateObject。见What is the difference between ObservedObject and StateObject in SwiftUI

以上是关于一个 ObservedObject 需要接受另一个 ObservedObject 作为参数;你怎么做到这一点?的主要内容,如果未能解决你的问题,请参考以下文章

ObservedObject 更改时的通知

StateObject 属性不会更新视图,但 ObservedObject 会

SwiftUI ObservedObject 不更新父视图

SwiftUI - 从 Swift 类启动的可观察对象不会更新 ContentView() 上的 @ObservedObject

ObservedObject 未触发视图重绘

SwiftUI 如何将数据传递给 ObservedObject 函数