SwiftUI中输入PIN后跳转LoginView及ViewModel传递问题
解决SwiftUI中PIN验证后跳转LoginView的问题
一、在WindowGroup中注入CreatePinViewModel实例
要让整个App共享同一个ViewModel实例,直接在App的WindowGroup中初始化ViewModel,再通过environmentObject注入到环境即可,所有子视图都能访问到这个共享实例:
@main struct DumbApp: App { private let createPinVM = CreatePinViewModel() var body: some Scene { WindowGroup { MainView() .environmentObject(createPinVM) } } }
二、实现状态传递与页面导航
1. MainView监听ViewModel状态切换视图
在MainView里通过@EnvironmentObject获取共享的ViewModel,根据showLoginPage属性决定显示登录页还是创建账户页:
struct MainView: View { @EnvironmentObject var createPinVM: CreatePinViewModel var body: some View { if createPinVM.showLoginPage { SignInView() // 你的LoginView } else { CreateAccountView() .sheet(isPresented: $createPinVM.showConfirmPinSheet) { ConfirmPinSheet() } } } }
2. ConfirmPinSheet更新ViewModel状态
ConfirmPinSheet同样用@EnvironmentObject获取ViewModel,点击确认按钮时更新状态并关闭sheet:
struct ConfirmPinSheet: View { @EnvironmentObject var createPinVM: CreatePinViewModel @Environment(\.dismiss) private var dismiss var body: some View { VStack { TextField("Enter PIN", text: $createPinVM.pin) Button("Confirm Pin") { // 这里可添加PIN验证逻辑 createPinVM.showLoginPage = true dismiss() } } } }
3. CreatePinViewModel的基础定义
确保ViewModel是可观察对象,包含所需的状态属性:
class CreatePinViewModel: ObservableObject { @Published var pin = "" @Published var showConfirmPinSheet = false @Published var showLoginPage = false }
关键注意点
- 所有用到
CreatePinViewModel的视图,必须声明@EnvironmentObject var createPinVM: CreatePinViewModel,否则会运行崩溃。 - 通过
environmentObject注入的ViewModel是全局共享的,ConfirmPinSheet中修改的showLoginPage会实时同步到MainView,自动触发视图切换。
内容的提问来源于stack exchange,提问作者Luka Šalipur
相关产品推荐
相关产品推荐

