SwiftUI中点击LoginView按钮无法加载HomeFeedView如何解决
问题原因
你在loginAction方法中仅实例化了HomeFeedView对象,没有将该视图关联到当前导航容器的跳转逻辑,SwiftUI无法感知到需要切换视图,因此界面无响应。
修复方案(适配iOS 16+)
通过@State变量控制导航跳转状态,配合navigationDestination修饰符实现跳转:
修改后的LoginView代码
// // LoginView.swift import SwiftUI private let screenSize = UIScreen.main.bounds struct LoginView: View { @State private var username: String = "" @State private var password: String = "" // 新增导航跳转控制状态 @State private var isLoginSuccess = false var body: some View { NavigationStack{ // iOS16以下可换回NavigationView ZStack { Color("light_blue").ignoresSafeArea() Image("logo_splash") VStack(spacing: 12) { TextField("Email/Username", text: $username) .textFieldStyle(.roundedBorder) SecureField("Password", text: $password) .textFieldStyle(.roundedBorder) Button(action: { loginAction(username: username, password: password) }, label: { OrangeButtonView(buttonTitle: "Login") }) } .padding(.horizontal, 24) // 绑定跳转目标 .navigationDestination(isPresented: $isLoginSuccess) { HomeFeedView() } } } } func loginAction(username: String, password: String) { // 这里可补充实际的登录校验逻辑,校验通过后修改跳转状态即可触发跳转 isLoginSuccess = true } } struct LoginView_Previews: PreviewProvider { static var previews: some View { LoginView() } }
兼容iOS 15及更低版本方案
如果需要兼容旧版本系统,保留NavigationView的同时,新增隐藏的NavigationLink实现跳转,把以下代码放到ZStack内部和VStack同级即可:
NavigationLink(isActive: $isLoginSuccess, destination: { HomeFeedView() }, label: { EmptyView() })
拓展说明
跳转状态isLoginSuccess也可以放到全局的ViewModel或者App状态管理类中,可同时实现登录状态全局控制、退出登录后自动返回登录页的需求。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

