Swift & Firebase - обновить ViewController после входа в систему - PullRequest
0 голосов
/ 03 мая 2019

Я добавил возможность для пользователя входить в систему через firebase, что прекрасно работает. Каждый раз, когда пользователь входит в систему, данные считываются из базы данных в реальном времени и добавляются в приложение.

При успешном входе в систему окно входа в систему закрывается и изменяется на мой «MainViewController». Этот «MainViewController» отображает startKm и currentKm, но, поскольку представление входа в систему закрывается, числа в «MainViewController» не обновляются - только после f.e. Снова измените представление или закройте приложение.

@IBAction func login(_ sender: Any) {
        guard let email = emailInput.text else { return }
        guard let password = passwordInput.text else { return }

        Auth.auth().signIn(withEmail: email, password: password) { user, error in
            if error == nil && user != nil {
                self.readData()
                self.dismiss(animated: false, completion: nil)
            } else {
                print("Error logging in: ", error!.localizedDescription)

                let alert = UIAlertController(title: "Fehler beim Einloggen", message: error!.localizedDescription, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Verstanden", style: .default, handler: nil))
                self.present(alert, animated: true, completion: nil)
            }
        }
    } 

func readData() {
        guard let uid = Auth.auth().currentUser?.uid else { return }
        let databaseRef = Database.database().reference()

        databaseRef.child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in

            let value = snapshot.value as? NSDictionary
            let monthlyStartKmData = value?["monthlyStartKm"] as? Int ?? 0
            let currentKmData = value?["currentKm"] as? Int ?? 0
            ...


            startKm = monthlyStartKmData
            currentKm = currentKmData
            ...


        }) { (error) in
            print(error.localizedDescription)
        }

    }

1 Ответ

0 голосов
/ 03 мая 2019
startKm = monthlyStartKmData
currentKm = currentKmData

Это не будет назначать переменные на вашем MainViewController, эти значения исчезнут, как только вы перейдете к другому viewController.Я не уверен, как вы меняете между viewControllers, но использование prepareForSegue полезно, когда вы хотите передать значения между viewControllers.

поместите этот код в свой loginViewController:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       let destinationVC = segue.destination as! MainViewController
       destinationVC.startKm = monthlyStartKmData
       destinationVC.currentKm = currentKmData 
}

Это должно работать, предполагая, что вы уже объявили переменные startKm и currentKm' within MainViewController`, и предполагаете, что вы переходите от logInVC к MainViewController.

Если есть другие сегменты, потенциально вызываемые в logInVC, добавьтеусловный оператор для вызова prepareForSegue, такой как:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "MainViewControllerSegue" { //or whatever you call the segue            
 let destinationVC = segue.destination as! MainViewController
           destinationVC.startKm = monthlyStartKmData
           destinationVC.currentKm = currentKmData 
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...