我想在用户决定更改用户名之前检查用户名是否已被占用。出于某种原因,当检查并按下完成时,会出现错误横幅,说明用户名已被使用(即使我输入的用户名显然不是),同时我的打印语句“已成功更改用户名”也在控制台中打印。用户名在数据库中成功更改,但由于出现错误横幅,它阻止我关闭推送的 View Controller 。
我似乎无法弄清楚为什么无论如何都会显示错误..这是我编写的代码..
func textFieldDidEndEditing(_ textField: UITextField) {
let trimmedString = usernameTextField.text?.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression).lowercased()
guard trimmedString != "" else {
print("ERROR: Please enter a valid username")
usernameChanged = false
return
}
updatedUsername = trimmedString?.lowercased()
usernameChanged = true
}
func updateUsername() {
guard let updatedUsername = self.updatedUsername else { return }
guard let currentUid = Auth.auth().currentUser?.uid else { return }
guard usernameChanged == true else { return }
let reference = Database.database().reference().child("activeUsernames")
let query = reference.queryOrdered(byChild: "username").queryEqual(toValue: updatedUsername )
query.observe(.value, with: { (DataSnapshot) in
if DataSnapshot.exists() {
print("Username already exists")
self.errorBanner()
} else {
print("Username successfully changed")
reference.child(currentUid).child("username").setValue(updatedUsername)
USER_REF.child(currentUid).child("username").setValue(updatedUsername) { (err, ref) in
guard let userProfileController = self.userProfileController else { return }
userProfileController.fetchCurrentUserData()
self.navigationController?.popViewController(animated: true)
}
}
})
}
@objc func handleDone() {
view.endEditing(true)
if usernameChanged {
updateUsername()
}
}
最佳答案
您滥用了 FirebaseRealtimeDatabase
API。
observe
应该传递实时事件,但您需要检查用户名是否存在,只需读取一次(请在此处检查如何执行 https://firebase.google.com/docs/database/ios/read-and-write#read_data_once)
所以您在代码中看到的基本上是您对设置的值感到困惑 :)
不过也有一些 Swift 的建议:
func textFieldDidEndEditing(_ textField: UITextField) {
// Here non-regex API is better
let trimmedString = usernameTextField.text?.trimmingCharacters(in: .whitespaceAndNewline)
guard trimmedString != "" else {
print("ERROR: Please enter a valid username")
return
}
updatedUsername = trimmedString?.lowercased()
}
// Swift willSet / didSet is better
var updatedUsername: String? {
willSet {
if updatedUsername != newValue {
usernameChange = true
}
}
}
var usernameChanged: Bool
关于swift - 检查用户名是否存在不会产生错误和错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57426565/