You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 12:24:53