ios 当登录状态改变时刷新页面的问题

jrcvhitl  于 2023-05-30  发布在  iOS
关注(0)|答案(1)|浏览(173)

我正在使用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
    }

}
mnemlml8

mnemlml81#

你犯了一个常见的错误:您创建了LoginVM的两个不同(独立)的示例。
始终使用一个示例。要么将其注入到环境中,要么通过视图层次结构传递它。
从SwiftUI 2开始,@State的引用类型等价物是@StateObject@Binding的等价物是@ObservedObject

struct ContentView: View {
    @StateObject var loginVM = LoginVM()

    var body: some View {
        NavigationStack{
            if loginVM.loginInfo.isLogin {
                HomeView()
            }else{
                LoginPage(loginVM: loginVM)
            }
        }
    }
}

struct LoginPage: View {
    @ObservedObject var loginVM : LoginVM

    var body: some View {
        VStack{
            Button("Login"){
                loginVM.changeIsLogin()
            }
        }
    }
}

语法@ObservedObject var loginVM : LoginVM()无论如何都是错误的,无法编译。

相关问题