SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个
Posted
技术标签:
【中文标题】SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个【英文标题】:SwiftUI map @Published var from one ObservableObject to another 【发布时间】:2020-08-26 16:40:33 【问题描述】:我希望两个单独的 ObjservableObject
共享一个 @Published 变量。
理想情况下如下所示。由于Cannot assign to property: '$bar' is immutable
,它无法编译。如果对其中一个或另一个进行更改,我希望 foo 和 bar 保持同步。
class FooState: ObservableObject
@Published var foo: Bool = false
class BarState: ObservableObject
@Published var bar: Bool
init(fooState: FooState)
self.$bar = fooState.$foo // compile error
let fooState = FooState()
let barState = BarState(fooState: fooState)
print(fooState.foo) // false
print(barState.bar) // false
fooState.foo = true
print(fooState.foo) // true
print(barState.bar) // true
【问题讨论】:
【参考方案1】:目前不支持(我认为)。我知道解决它的唯一方法是自己订阅嵌套的可观察对象并传播objectWillChange
事件:
class FooState: ObservableObject
@Published var foo: Bool = false
class BarState: ObservableObject
var fooState: FooState
var bar: Bool
return self.fooState.foo
private var cancellables = Set<AnyCancellable>()
init(fooState: FooState)
self.fooState = fooState
fooState.objectWillChange
.sink [weak self] in
self?.objectWillChange.send()
.store(in: &cancellables)
let fooState = FooState()
let barState = BarState(fooState: fooState)
print(fooState.foo) // false
print(barState.bar) // false
fooState.foo = true
print(fooState.foo) // true
print(barState.bar) // true
【讨论】:
以上是关于SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个的主要内容,如果未能解决你的问题,请参考以下文章
在 Firebase 完成块中设置 @Published var 不更新 SwiftUI 视图
如果操作未立即完成,则 SwiftUI 视图在绑定到 @Published var 时没有动画
在 SwiftUI 中,如何对“视图”的“@Published vars”*outside* 上的更改做出反应
SwiftUI 如何将@Published 分配给另一个@Published