2016-09-09 1 views
2

Firebase-Authentifizierung - Benutzerdaten können nach der Anmeldung nicht abgerufen werden.Swift - Login mit FireBase - Benutzerdaten können nach der Anmeldung nicht abgerufen werden

Ich versuche, die Benutzer E-Mail nach der Anmeldung (Login-Controller) abrufen und in einem UILABEL auf einem anderen Controller (Maincontroller) anzuzeigen. Wenn Sie einen Benutzer erstellen oder einen vorhandenen verwenden, funktioniert er nach dem ersten Start der App einwandfrei. Wenn Sie sich jedoch abmelden und versuchen, eine andere E-Mail zu verwenden, funktioniert das nicht.

Ich habe zwei View-Controller:

import UIKit 
import Firebase 
import FirebaseAuth 
import FirebaseDatabase 

class LoginViewController: UIViewController { 

    var ref: FIRDatabaseReference! 


    @IBOutlet weak var emailTextField: UITextField! 
    @IBOutlet weak var passwordTextField: UITextField! 


    override func viewDidLoad() { 
     super.viewDidLoad() 

     ref = FIRDatabase.database().reference() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    @IBAction func signInButton(sender: AnyObject) { 
     FIRAuth.auth()?.signInWithEmail(emailTextField.text! , password: passwordTextField.text!, completion: { (user, error) in 

      if error != nil { 
       print(error!.localizedDescription) 
      } 
     }) 

     self.performSegueWithIdentifier("MainViewSegue", sender: self) 
    } 

    @IBAction func createAccountButton(sender: AnyObject) { 
     FIRAuth.auth()?.createUserWithEmail(emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in 

      if error != nil { 
       print(error!.localizedDescription) 
      } else { 

       print("User Created.") 
       let userID: String = user!.uid 
       let userEmail:String = self.emailTextField.text! 
       self.ref.child("users").child(userID).setValue(["email": userEmail]) 
      } 
     }) 
    } 
} 

und:

import Foundation 
import UIKit 
import Firebase 
import FirebaseDatabase 

class MainViewController: UIViewController { 

    var ref: FIRDatabaseReference! 
    var refHandle: UInt! 

    @IBOutlet weak var userEmailLabel: UILabel! 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     ref = FIRDatabase.database().reference() 

     refHandle = ref.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in 
      let dataDict = snapshot.value as! [String: AnyObject] 

      print((dataDict)) 
     }) 


     let userID: String = (FIRAuth.auth()?.currentUser?.uid)! 
     ref.child("users").child(userID).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
      let userEmail = snapshot.value!["email"] as! String 
      self.userEmailLabel.text = userEmail 
     }) 
    } 

    @IBAction func signOutButton(sender: AnyObject) { 
     try! FIRAuth.auth()!.signOut() 
     if let storyboard = self.storyboard { 
      let viewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController") 
      self.presentViewController(viewController, animated: false, completion: nil) 
     } 
    } 
} 

Dies ist, wo ich den Fehler EXC_BAD_INSTRUCTION:

let userID: String = (FIRAuth.auth()?.currentUser?.uid)! 
+0

es druckt Null aus. – cosmos

Antwort

0

CMD + Klick auf signInWithEmail in FIRAuth.auth()?.signInWithEmail(emailT... und Sie werden in der jeweiligen Dokumentation gerichtet sein, über diese Funktion in seiner Dokumentation, die Sie sehen: -

@param Abschluss Optional; ein Block, der aufgerufen wird, wenn das Vorzeichen endet, oder abgebrochen ist. Wird in Zukunft auf dem Hauptthread asynchron aufgerufen.

die Ihre completionBlock bedeutet wird aufgerufen, wenn Ihre Benutzer entweder in oder signInWithEmail Funktion unterzeichnet hat einige error.But in Ihrem Fall gegeben self.performSegueWithIdentifier("MainViewSegue", sender: self) wird aufgerufen, noch bevor Ihre completionBlock: genannt wird.

Versuchen Sie folgendes: -

@IBAction func signInButton(sender: AnyObject) { 
    FIRAuth.auth()?.signInWithEmail(emailTextField.text! , password: passwordTextField.text!, completion: { (user, error) in 

     if error != nil { 
      print(error!.localizedDescription) 
     }else if error == nil{ 
       self.performSegueWithIdentifier("MainViewSegue", sender: self) 
      } 
    }) 
} 

Auch ersetzen: -

let userID: String = (FIRAuth.auth()?.currentUser?.uid)! 

mit

let userID: String = FIRAuth.auth()!.currentUser!.uid 

Keine Notwendigkeit, mit Nachdruck einen optionalen Wert auszupacken, die Sie wissen, existiert

Verwandte Themen