这是一个特殊的问题,而不是一般性的'你怎么做......'问题。在我的应用中,用户可以使用电子邮件和密码登录到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()
}
}