這是一個特殊的問題,而不是一般性的'你怎麼做......'問題。在我的應用中,用戶可以使用電子郵件和密碼登錄到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()
}
}