ios - 按下注册按钮后,即使用户名文本字段为空,电子邮件和密码也会保存在 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)
}
}
}
}
}
解决方案
在为用户创建帐户后,您正在检查用户名,这就是为什么您拥有一个帐户而不管有用户名的原因。
您可能应该在创建帐户之前检查用户名是否存在。使用 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)
}
}
}
}
}
推荐阅读
- asp.net-core - 我可以使用当前 NTML 上下文从 WebAPI 控制器(或 BlazorComponent)内部发出请求吗?
- github - 有没有办法将 2 个本地文件夹连接到 2 个单独的 github 分支
- ruby-on-rails - rails NoMethodError(“1”的未定义方法`map':String您是说吗?点击):
- c++ - 键盘记录器返回所有值
- angular - 如何在 NgRx 中使用 remote-redux-devtools?
- inheritance - UML 中继承的 actor 具有不同行为的相同用例
- java - @RequestMapping 注释控制器中的运行时异常 - 哪个 HTTP 响应代码?
- c# - 实体框架在插入子项后不保存导航属性
- c - 在没有 WMI 的 Windows 中查找 MaxNumberOfProcesses
- c - 为什么我的程序没有提示输入最终值?[C]