【问题标题】:One ObservedObject needs to take in another ObservedObject as an argument; how do you do this?一个 ObservedObject 需要接受另一个 ObservedObject 作为参数;你怎么做到这一点?
【发布时间】: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 中声明)

【问题讨论】:

    标签: swift swiftui observableobject observedobject


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多