如何告诉 SwiftUI 视图绑定到多个嵌套的 ObservableObject
How to tell SwiftUI views to bind to more than one nested ObservableObject
我有两个 class 嵌套在另一个 class 中,这是 SwiftUI 视图中的可观察对象。即使嵌套 classes 中的属性被声明为 @Published,它们的值(当它们改变时)不会在主视图中更新。
这里有人问过类似的问题,我可以用它来让它为两个子class之一工作,但不能同时工作。
这是型号:
class Submodel1: ObservableObject {
@Published var count = 0
}
class Submodel2: ObservableObject {
@Published var count = 0
}
class Model: ObservableObject {
@Published var submodel1: Submodel1 = Submodel1()
@Published var submodel2: Submodel2 = Submodel2()
}
这是主视图:
struct ContentView: View {
@ObservedObject var model: Model = Model()
var body: some View {
VStack {
Text("Count: \(model.submodel1.count)")
.onTapGesture {
self.model.submodel1.count += 1
}
Text("Count: \(model.submodel2.count)")
.onTapGesture {
self.model.submodel2.count += 1
}
}
}
}
将此添加到模型 class(请参阅前面的 Whosebug 问题)适用于更新 submodel1 更改,但不能同时更新:
var anyCancellable: AnyCancellable? = nil
init() {
anyCancellable = submodel1.objectWillChange.sink { (_) in
self.objectWillChange.send()
}
}
我正在寻找的是将 submodel1 和 submodel2 的更改传递到我的视图的方法。
您可以使用 CombineLatest
扩展您链接到的问题的答案,让您的模型在任一基础对象发生变化时触发其 objectWillChange
发布者:
import Combine
class Model: ObservableObject {
@Published var submodel1: Submodel1 = Submodel1()
@Published var submodel2: Submodel2 = Submodel2()
var anyCancellable: AnyCancellable? = nil
init() {
anyCancellable = Publishers.CombineLatest(submodel1.$count,submodel2.$count).sink(receiveValue: {_ in
self.objectWillChange.send()
})
}
}
我有两个 class 嵌套在另一个 class 中,这是 SwiftUI 视图中的可观察对象。即使嵌套 classes 中的属性被声明为 @Published,它们的值(当它们改变时)不会在主视图中更新。
这里有人问过类似的问题,我可以用它来让它为两个子class之一工作,但不能同时工作。
这是型号:
class Submodel1: ObservableObject {
@Published var count = 0
}
class Submodel2: ObservableObject {
@Published var count = 0
}
class Model: ObservableObject {
@Published var submodel1: Submodel1 = Submodel1()
@Published var submodel2: Submodel2 = Submodel2()
}
这是主视图:
struct ContentView: View {
@ObservedObject var model: Model = Model()
var body: some View {
VStack {
Text("Count: \(model.submodel1.count)")
.onTapGesture {
self.model.submodel1.count += 1
}
Text("Count: \(model.submodel2.count)")
.onTapGesture {
self.model.submodel2.count += 1
}
}
}
}
将此添加到模型 class(请参阅前面的 Whosebug 问题)适用于更新 submodel1 更改,但不能同时更新:
var anyCancellable: AnyCancellable? = nil
init() {
anyCancellable = submodel1.objectWillChange.sink { (_) in
self.objectWillChange.send()
}
}
我正在寻找的是将 submodel1 和 submodel2 的更改传递到我的视图的方法。
您可以使用 CombineLatest
扩展您链接到的问题的答案,让您的模型在任一基础对象发生变化时触发其 objectWillChange
发布者:
import Combine
class Model: ObservableObject {
@Published var submodel1: Submodel1 = Submodel1()
@Published var submodel2: Submodel2 = Submodel2()
var anyCancellable: AnyCancellable? = nil
init() {
anyCancellable = Publishers.CombineLatest(submodel1.$count,submodel2.$count).sink(receiveValue: {_ in
self.objectWillChange.send()
})
}
}