Получение обновленного значения из @ObservedObject в SwiftUI - PullRequest
2 голосов
/ 30 октября 2019

Я пытаюсь изменить представление при входе пользователя в систему, то есть когда 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("")
                }
            }
        }
    }
}

А вот где я вызываю функцию login

LoginView

struct LoginView: View{

    @ObservedObject var auth = Authentication()

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

1 Ответ

1 голос
/ 30 октября 2019

Когда вы говорите

@ObservedObject var auth = Authentication()

... в двух разных видах, это два разных объекта аутентификации. То, что происходит в одном, не может повлиять на то, что происходит в другом.

Если ваша цель - разделить один объект Аутентификации между представлениями, вам потребуется @EnvironmentObject.

...