首页 > 解决方案 > 按下注册按钮后,即使用户名文本字段为空,电子邮件和密码也会保存在 firebase 中

问题描述

这是来自注册视图控制器的代码

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
    }

这是按下注册按钮后必须执行的代码,但是如果我填写密码和电子邮件而不是用户名,它会引发错误,并且它仍然会在没有用户名的情况下保存数据,并且在我尝试使用相同的注册后电子邮件它说这个电子邮件已经存在,即使用户名是空的

@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)
                }
            }
        }
    }
    
}

标签: iosswiftfirebasevalidation

解决方案


在为用户创建帐户后,您正在检查用户名,这就是为什么您拥有一个帐户而不管有用户名的原因。

您可能应该在创建帐户之前检查用户名是否存在。使用 aguard 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)
            }
        }
    }
}

您也不会显示任何电子邮件或密码检查。您不妨考虑添加它们。这就是我将通过检查电子邮件和密码来完全重构您的代码的方式,加上移动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)
                }
            }
        }
    }
}

推荐阅读