在SwiftUI中从@ObservedObject获取更新的值

时间:2019-10-30 16:50:33

标签: ios swift swiftui combine

我正在尝试在用户登录时(即在 Authentication 类中更新 isAuthenticated 时)更改视图,但是它从未获得新值,我我不确定我是否正确理解了一切。

身份验证

class Authentication: ObservableObject{

    @Published var email: String = ""
    @Published var password: String = ""
    @Published var isAuthenticated : Bool = false

    func login(){
        AppDelegate._bc.authenticateEmailPassword(email,
                                                  password: password,
                                                  forceCreate: false,
                                                  completionBlock: onAuthenticate,
                                                  errorCompletionBlock: onAuthenticateFailed,
                                                  cbObject: nil)
    }

    func onAuthenticate(serviceName:String?, serviceOperation:String?, jsonData:String?, cbObject: NSObject?) {

        /............./

        UserDefaults.standard.set(true, forKey: "HasAuthenticated")
        self.isAuthenticated.toggle()
        print("Login DONE!")
    }
}

到目前为止一切都还好,用户通过了身份验证,并显示“ Login DONE!”(登录完成!)。并将 isAuthenticated 值更新为true。

但是在 AuthView 中,它不会收到新值

AuthView

struct AuthView: View {

    @ObservedObject var auth = Authentication()

    var body: some View {
        NavigationView{
            VStack{
                /............./

                LoginView()

                NavigationLink(destination: ProfileView(), isActive: $auth.isAuthenticated) {
                    Text("")
                }
            }
        }
    }
}

在这里我称为登录函数

LoginView

struct LoginView: View{

    @ObservedObject var auth = Authentication()

    var body: some View {
        VStack(){
            Button(action: {
                self.auth.login()
            }) {
                LoginButtonContent(state: "Login")
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

当你说

@ObservedObject var auth = Authentication()

...在两个不同的视图中,它们是两个不同的身份验证对象。一个发生的事情不会影响另一个发生的事情。

如果您的目标是在视图之间共享单个身份验证对象,则需要@EnvironmentObject