我有一个SwiftUI视图,其中包含一个名为appModel
的EnvironmentObject。然后,它以appModel.submodel.count
方法读取值body
。我希望这会将我的视图绑定到count
上的属性submodel
,以便在属性更新时重新呈现,但似乎不会发生。
这是错误吗?如果没有,那么将视图绑定到SwiftUI中环境对象的嵌套属性的惯用方式是什么?
特别是我的模特看起来像这样...
class Submodel: ObservableObject {
@Published var count = 0
}
class AppModel: ObservableObject {
@Published var submodel: Submodel = Submodel()
}
我的观点看起来像这样...
struct ContentView: View {
@EnvironmentObject var appModel: AppModel
var body: some View {
Text("Count: \(appModel.submodel.count)")
.onTapGesture {
self.appModel.submodel.count += 1
}
}
}
当我运行应用程序并单击标签时,count
属性确实增加了,但标签没有更新。
我可以通过将appModel.submodel
作为属性传递给ContentView
来解决此问题,但如果可能的话,我想避免这样做。
嵌套模型在SwiftUI中尚不可用,但是您可以执行以下操作
class Submodel: ObservableObject {
@Published var count = 0
}
class AppModel: ObservableObject {
@Published var submodel: Submodel = Submodel()
var anyCancellable: AnyCancellable? = nil
init() {
anyCancellable = submodel.objectWillChange.sink { (_) in
self.objectWillChange.send()
}
}
}
基本上是您的AppModel
从Submodel
捕获事件并将其进一步发送到视图
编辑:
如果您不需要SubModel
上课,则可以尝试这样的事情:
struct Submodel{
var count = 0
}
class AppModel: ObservableObject {
@Published var submodel: Submodel = Submodel()
}