繁体   English   中英

按下注册按钮后,即使用户名文本字段为空,email 和密码也会保存在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM