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“

之后这一切都为我工作完美!

希望我可以帮助某人这个答案。

相关问题