SwiftUI中如何将LoginView的StateObject视图模型传入SignUp视图
解决方案
步骤1:修改Signup视图,添加viewModel属性
在Signup视图中声明一个@ObservedObject类型的viewModel属性,用于接收LoginView传递的实例:
struct Signup : View { @ObservedObject var viewModel: LoginViewModelImpl @Binding var index : Int var body: some View { // ... 原有视图代码 Button(action: { viewModel.register() }) { Text("Signup") } // ... 原有视图代码 } }
步骤2:在LoginView中传递viewModel实例
调用Signup视图时,直接将LoginView中的viewModel作为参数传入(无需$符号,因为它是引用类型):
struct LoginView: View { @State var index = 0 @State var showSheet = false @StateObject var viewModel = LoginViewModelImpl(service: LoginServiceImpl()) @State var forgotEmail = "" var body: some View { ZStack { VStack { Image("logo_name") .resizable() .aspectRatio(contentMode: .fit) .frame(width: 200.0) .padding(.top, 80) Spacer() ZStack { // 传递viewModel给Signup Signup(index: self.$index, viewModel: viewModel) .zIndex(Double(self.index)) // ... 其他视图代码 } } } } }
补充说明
LoginViewModelImpl是ObservableObject子类,属于引用类型,直接传递实例即可实现两个视图共享同一个viewModel。@ObservedObject可以让Signup视图自动响应viewModel中@Published属性的状态变化,保证UI同步更新。- 若项目基于iOS17+,也可使用
@Bindable替代@ObservedObject,语法更简洁,但@ObservedObject对低版本系统兼容性更好。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

