gpt4 book ai didi

swift - 在 SwiftUI 组件之间共享 ViewModel

转载 作者:行者123 更新时间:2023-12-05 02:58:01 46 4
gpt4 key购买 nike

我想为使用 SwiftUI 和 Combine 实现的架构实现导航器/路由器。简而言之,View 将与 Router 共享 viewModel。当 View 触发 viewModel 上的更改时,Router 应该导航到新工作表。

这是我的代码版本,我直接将 viewModelView 传递到 Router。有什么问题吗?我最大的疑问是,由于我在 RouterView 上都使用了 @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 的路由器这一事实(我主要是在做练习)...这个实现有什么问题吗?

最佳答案

这个

view.sheet(isPresented: $viewModel.presentSignIn){
SignInView()

必须位于body 中的某处(直接或通过计算属性或函数)但在body 的ViewBuilder 中

关于swift - 在 SwiftUI 组件之间共享 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59424354/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com