【发布时间】:2019-12-20 11:13:43
【问题描述】:
我想为使用 SwiftUI 和 Combine 实现的架构实现导航器/路由器。简而言之,View 将与Router 共享viewModel。当View 触发viewModel 上的更改时,Router 应导航到新工作表。
这是我的代码的一个版本,我将viewModel 从View 直接传递给Router。有什么不对的吗?我最大的疑问是,由于我在Router 和View 上都使用了@ObservedObject,因此创建了viewModel 的两个不同实例。
查看模型
class BootViewModel:ObservableObject{
@Published var presentSignIn = false
}
查看
struct BootView: View {
@ObservedObject var viewModel:BootViewModel
var navigator:BootNavigator<BootView>? = nil
init(viewModel:BootViewModel) {
self.viewModel = viewModel
self.navigator = BootNavigator(view: self, viewModel: viewModel)
self.navigator.setSubscriptions()
}
var body: some View {
VStack{
Text("Hello")
Button("Button"){
self.viewModel.presentSignIn.toggle()
}
}
}
}
导航器
class BootNavigator<T:View>{
var view:T? = nil
@ObservedObject var viewModel:BootViewModel
init(view:T, viewModel:BootViewModel) {
self.view = view
self.viewModel = viewModel
}
func setSubscriptions(){
subscribe(onSigninPressed: $viewModel.presentSignIn)
}
func subscribe(onSigninPressed : Binding<Bool>){
_ = view.sheet(isPresented: $viewModel.presentSignIn){
SignInView()
}
}
}
- 为什么从未显示
SignInView? - 没有考虑到通常不需要使用带有 swiftUI 的路由器这一事实(我主要是在做一个练习)......这个实现有什么问题吗?
【问题讨论】: