我有一个可以观察到的 AppState:
class AppState: ObservableObject {
private init() {}
static let shared = AppState()
@Published fileprivate(set) var isLoggedIn = false
}
Run Code Online (Sandbox Code Playgroud)
视图模型应该根据状态 ( isLoggedIn)决定显示哪个视图:
class AppState: ObservableObject {
private init() {}
static let shared = AppState()
@Published fileprivate(set) var isLoggedIn = false
}
Run Code Online (Sandbox Code Playgroud)
最后 aHostView观察该containedView属性并根据它显示正确的视图。
我的问题是isLoggedIn上面的代码没有被观察到,我似乎无法找到一种方法来做到这一点。我很确定有一个简单的方法,但是经过 4 个小时的反复试验,我希望这里的社区可以帮助我。
工作解决方案:
在使用 Combine 两周后,我现在再次修改了我以前的解决方案(请参阅编辑历史记录),这是我现在能想到的最好的解决方案。这仍然不完全是我的想法,因为contained不是同时订阅者和发布者,但我认为AnyCancellable总是需要的。如果有人知道实现我的愿景的方法,请仍然告诉我。
class HostViewModel: ObservableObject, Identifiable {
@Published var contained: DisplayableContent
private var containedUpdater: AnyCancellable?
init() {
self.contained = .welcome
setupPipelines()
}
private func setupPipelines() {
self.containedUpdater = AppState.shared.$isLoggedIn
.map { $0 ? DisplayableContent.mainContent : .welcome }
.assign(to: \.contained, on: self)
}
}
extension HostViewModel {
enum DisplayableContent {
case welcome
case mainContent
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3731 次 |
| 最近记录: |