一个 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 作为参数;你怎么做到这一点?的主要内容,如果未能解决你的问题,请参考以下文章
StateObject 属性不会更新视图,但 ObservedObject 会
SwiftUI - 从 Swift 类启动的可观察对象不会更新 ContentView() 上的 @ObservedObject