0

這是一個特殊的問題,而不是一般性的'你怎麼做......'問題。在我的應用中,用戶可以使用電子郵件和密碼登錄到Firebase帳戶,然後將其帶到包含多個字段的數據輸入頁面。如果用戶已經存在,他們的數據將被下載到他們可以編輯並保存回數據庫的字段中。Swift 3 Firebase用戶認證/使用電子郵件密碼登錄數據庫

所有這些工作都很好,除了一件事。當我測試它並登錄到帳戶時,它會從用戶那裏下載現有數據。但是,如果我註銷並使用其他用戶登錄,它仍會下載(或顯示)以前登錄信息。我檢查過用戶實際上是使用「FIRAuth.auth()?. addStateDidChangeListener」註銷的。在特定設備上有單個用戶並不是一個真正的問題,但我不喜歡它無法正常工作,並且很好解決問題。任何幫助將不勝感激 - 也許我失去了明顯的東西? :-)

有相當多的代碼,所以我削減了一點,但保留了主要部分。 (小小的咆哮,我注意到很多時候,當人們要求更多的代碼時,他們往往不是那些真正去幫助的人,我認爲聲譽建設者非常惱人)。

class UserLoginViewController: UIViewController { 

@IBOutlet weak var userNameLabel: UILabel! 
@IBOutlet weak var emailField: UITextField! 
@IBOutlet weak var passwordField: UITextField! 
@IBOutlet weak var logoutButton: UIButton! 

var ref: FIRDatabaseReference! 

override func viewDidLoad() { 
super.viewDidLoad() 

    ref = FIRDatabase.database().reference() 

//======Check if logged in, if so hide login button 
    if let user = FIRAuth.auth()?.currentUser 
    { 
     self.logoutButton.alpha = 1.0 
     self.userNameLabel.text = user.email 
    } 
    else 
    { 
     self.logoutButton.alpha = 0.0 
     self.userNameLabel.text = "" 
    } 
} 

//======LogIn 

@IBAction func loginAction(_ sender: AnyObject) 
{ 
    if self.emailField.text == "" || self.passwordField.text == "" 
    { 
     let alertController = UIAlertController(title: "Oops!", message: "Please enter an email and password.", preferredStyle: .alert)   
     let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil) 
     alertController.addAction(defaultAction) 

     self.present(alertController, animated: true, completion: nil) 
    } 
    else 
    { 
     FIRAuth.auth()?.signIn(withEmail: self.emailField.text!, password: self.passwordField.text!) { (user, error) in 
      if error == nil 
      { 
       self.logoutButton.alpha = 1.0 
       self.userNameLabel.text = user!.email 
       self.emailField.text = "" 
       self.passwordField.text = "" 
     // ===Segue to DataInput 
       self.performSegue(withIdentifier: "loginSegue",sender: nil) 
      } 
      else 
      { 
       let alertController = UIAlertController(title: "Oops!", message: error?.localizedDescription, preferredStyle: .alert) 
       let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil) 
       alertController.addAction(defaultAction) 
       self.present(alertController, animated: true, completion: nil) 
      } 
     } 
    } 
} 

這然後鏈接到數據錄入頁面:

import UIKit 
import Firebase 

var ref: FIRDatabaseReference! 
let user = FIRAuth.auth()?.currentUser 

var myEmptyField = "" 
var myUid = user!.uid 

class DataInputViewController: UIViewController { 

@IBAction func unwindDataInputViewController(segue: UIStoryboardSegue) { 
} 

var newAccount: String! 
var myLon: String! 
var myLat: String! 


// ref user data on Firebase 
let ownernameRef = FIRDatabase.database().reference().child("https://stackoverflow.com/users/\(myUid)/ownername") 
let nameRef = FIRDatabase.database().reference().child("https://stackoverflow.com/users/\(myUid)/name") 
let typeRef = FIRDatabase.database().reference().child("users/\(myUid)/type") 

@IBOutlet weak var ownerNameTextField: UITextField! 
@IBOutlet weak var nameTextField: UITextField! 
@IBOutlet weak var areaTextField: UITextField! 
@IBOutlet weak var typeTextField: UITextField! 

override func viewDidLoad() { 
    super.viewDidLoad() 
// clearNull() 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    //reads database to viewcontroller 
    if newAccount == "no" { 

    self.ownernameRef.observe(.value) { (snap:FIRDataSnapshot) in self.ownerNameTextField.text = (snap.value as AnyObject).description} 
    self.nameRef.observe(.value) { (snap:FIRDataSnapshot) in self.nameTextField.text = (snap.value as AnyObject).description} 
    self.typeRef.observe(.value) { (snap:FIRDataSnapshot) in ion} 

      } 
    }else{ 
     if newAccount == "yes"{ 
      let date = Date() 
      let formatter = DateFormatter() 
      formatter.dateFormat = "dd.MM.yyyy" 
      let startDate = formatter.string(from: date) 

      accountSetupDateTextField.text = startDate 

     // clearNull() 
     } 
    } 

回答

0

我希望你能解決你的問題在五個月內,但也許其他人需要的答案。

今天我有同樣的問題和只能解決我發現是:

  • 集「讓用戶= FIRAuth.auth()?currentUser」作爲變量「VAR」
  • 變化「變種myUid =用戶!.uid 「到 」變種myUid =字符串()「
  • 在UserLoginViewController放的viewDidLoad方法
  • 」用戶=零「
  • 在DataInputViewController的viewDidLoad方法
  • 把」 用戶= FIRAuth.auth( )?。currentUser「並添加」myUid = user!.uid「

之後這一切都爲我工作完美!

希望我可以幫助某人這個答案。

相關問題