[英]Storing a username on sign up only displays after page refresh (Firebase)
[英]After pressing the sign up button the email and password are saved in firebase even if the username text field was empty
这是注册视图中的代码 controller
import UIKit
import Firebase
class SignUpViewController: UIViewController {
@IBOutlet weak var userNameTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var errorLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
userNameTextField.backgroundColor = .clear
userNameTextField.layer.cornerRadius = 27
userNameTextField.layer.borderWidth = 1
userNameTextField.layer.borderColor = UIColor.systemGreen.cgColor
emailTextField.backgroundColor = .clear
emailTextField.layer.cornerRadius = 27
emailTextField.layer.borderWidth = 1
emailTextField.layer.borderColor = UIColor.systemGreen.cgColor
passwordTextField.backgroundColor = .clear
passwordTextField.layer.cornerRadius = 27
passwordTextField.layer.borderWidth = 1
passwordTextField.layer.borderColor = UIColor.systemGreen.cgColor
}
这是按下注册按钮后必须执行的代码,但是如果我填写密码和 email 而不是用户名,它会抛出错误并且它仍然保存没有用户名的数据并且在我尝试使用相同的注册后email 它说这个 email 已经存在,即使用户名是空的
@IBAction func signupPressed(_ sender: UIButton) {
if let email = emailTextField.text, let password = passwordTextField.text {
Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
if let e = error {
self.errorLabel.text = e.localizedDescription
} else if self.userNameTextField.text == "" || self.userNameTextField.text!.count <= 3 {
self.errorLabel.text = "Please enter a valid username"
} else {
//Navigate to the ChatViewController
let db = Firestore.firestore()
db.collection("users").addDocument(data: ["username": self.userNameTextField.text!, "uid": authResult!.user.uid]) { (error) in
if let e = error {
self.errorLabel.text = e.localizedDescription
}
}
self.performSegue(withIdentifier: "goToMap", sender: self)
}
}
}
}
}
在为用户创建帐户后,您正在检查用户名,这就是为什么无论是否有用户名,您都有一个帐户。
您可能应该在创建帐户之前检查用户名是否存在。 使用guard let
可以让您检查用户名是否符合您的条件。
@IBAction func signupPressed(_ sender: UIButton) {
// check that the username exists and that it is of a valid length
guard let username = self.userNameTextField.text, username.count > 3 else {
self.errorLabel.text = "Please enter a valid username"
return
}
if let email = emailTextField.text, let password = passwordTextField.text {
Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
if let e = error {
self.errorLabel.text = e.localizedDescription
} else {
//Navigate to the ChatViewController
let db = Firestore.firestore()
db.collection("users").addDocument(data: ["username": username, "uid": authResult!.user.uid]) { (error) in
if let e = error {
self.errorLabel.text = e.localizedDescription
}
}
// This will navigate the user regardless of whether the
// database update was successful or not.
// You may want to reconsider this, and handle it in the above closure.
self.performSegue(withIdentifier: "goToMap", sender: self)
}
}
}
}
您也没有显示 email 或密码的任何支票。 您也可以考虑添加它们。 这就是我将如何通过检查 email 和密码来完全重构您的代码,并移动performSegue
调用,以便它仅在您没有因添加用户名而出错时才会发生。
@IBAction func signupPressed(_ sender: UIButton) {
// check that the username exists and that it is of a valid length
guard let username = self.userNameTextField.text, username.count > 3 else {
self.errorLabel.text = "Please enter a valid username"
return
}
guard let password = passwordTextField.text else {
self.errorLabel.text = "Please enter a valid password"
return
}
guard let email = emailTextField.text else {
self.errorLabel.text = "Please enter a valid email"
return
}
Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
if let e = error {
self.errorLabel.text = e.localizedDescription
} else {
//Navigate to the ChatViewController
let db = Firestore.firestore()
db.collection("users").addDocument(data: ["username": username, "uid": authResult!.user.uid]) { (error) in
if let e = error {
// You may not want to show this error to the user but you should still show a "sanitised" error so that it doesn't leak information.
self.errorLabel.text = e.localizedDescription
} else {
self.performSegue(withIdentifier: "goToMap", sender: self)
}
}
}
}
}
在代码中if let email = emailTextField.text, let password = passwordTextField.text
您正在检查字符串引用是否不是nil
。 您还想知道此字符串是否不等于""
。
在这种情况下,我们可以使用便利的 getter: isEmpty
。
最终代码示例:
@IBAction func signupPressed(_ sender: UIButton) {
if let email = emailTextField.text, let password = passwordTextField.text {
guard !email.isEmpty, !password.isEmpty else { return }
Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
if let e = error {
self.errorLabel.text = e.localizedDescription
} else if self.userNameTextField.text == "" || self.userNameTextField.text!.count <= 3 {
self.errorLabel.text = "Please enter a valid username"
} else {
//Navigate to the ChatViewController
let db = Firestore.firestore()
db.collection("users").addDocument(data: ["username": self.userNameTextField.text!, "uid": authResult!.user.uid]) { (error) in
if let e = error {
self.errorLabel.text = e.localizedDescription
}
}
self.performSegue(withIdentifier: "goToMap", sender: self)
}
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.