我正在使用SwiftUI开发一个应用程序,我计划实现一个功能,该应用程序在进入时检查登录状态,并相应地显示登录页面或主页。在登录页面登录后,应用程序应导航到主界面。但我遇到了一个问题。
我尝试使用以下方法实现这一点,但当我将'LoginPage()'中的'ifLogin'状态更改为true时,页面不会转换为'HomeView()'。或者,有没有更好的方法来实现它?我将不胜感激。
struct ContentView: View {
@ObservedObject var loginVM : LoginVM()
var body: some View {
NavigationStack{
if loginVM.loginInfo.isLogin {
HomeView()
}else{
LoginPage()
}
}
}
}
import SwiftUI
struct LoginPage: View {
@ObservedObject var loginVM = LoginVM()
var body: some View {
VStack{
Button("Login"){
loginVM.changeIsLogin()
}
}
}
}
import SwiftUI
class LoginVM: ObservableObject {
@Published var loginInfo = Login(isLogin: false)
func changeIsLogin(){
loginInfo.changeLoginState()
}
}
import Foundation
struct Login {
var isLogin: Bool
mutating func changeLoginState() {
isLogin.toggle()
}
init(isLogin: Bool) {
self.isLogin = isLogin
}
}
1条答案
按热度按时间mnemlml81#
你犯了一个常见的错误:您创建了
LoginVM
的两个不同(独立)的示例。始终使用一个示例。要么将其注入到环境中,要么通过视图层次结构传递它。
从SwiftUI 2开始,
@State
的引用类型等价物是@StateObject
,@Binding
的等价物是@ObservedObject
。语法
@ObservedObject var loginVM : LoginVM()
无论如何都是错误的,无法编译。