После нажатия кнопки «Зарегистрироваться» приложение должно запустить функцию, в которой оно проверяет, занято ли введенное пользователем имя пользователя. Если это так, он остановит процесс «создания учетной записи» и скажет пользователю ввести другое имя пользователя.
Однако, после ввода того же имени пользователя и нажатия кнопки регистрации, мое приложение вылетает с ошибкой Thread 1: signal SIGABRT
. Строка ошибки прокомментирована ниже.
Буду очень признателен, если кто-нибудь сможет мне помочь.
Файл базы данных JSON:
{
"usernames" : {
"itsandyjiang" : "0vFQYnfIbahHdC1RsuNMW45HYNR2"
},
"users" : {
"0vFQYnfIbahHdC1RsuNMW45HYNR2" : {
"email" : "andyjiang55@yahoo.com",
"username" : "itsandyjiang"
}
}
}
Функция, проверяющая, вошел ли пользователь в имя пользователя, которое не занято:
func isValidUsername(username: String) {
let usernameRegex = ".{3,}"
var valid = NSPredicate(format: "SELF MATCHES %@", usernameRegex).evaluate(with: username)
if valid {
valid = !username.contains("Invalid username id")
}
if valid == false {
usernameLabel.textColor = UIColor.red
usernameLabel.text = "USERNAME MUST BE AT LEAST 3 CHARS"
usernameTextField.layer.addBorder(edge: UIRectEdge.bottom, color: UIColor.red, thickness: 1.5)
} else {
let ref = Database.database().reference(fromURL: "https://testapp-testtest.firebaseio.com/")
let usernamesRef = ref.child("usernames")
usernamesRef.observeSingleEvent(of: .value, with: { (snapshot) in
let usernamesArray = Array(snapshot.value as! [String]) //ERROR LINE
for storedUsername in usernamesArray {
if storedUsername == self.usernameTextField.text! {
self.usernameVerified = false
self.usernameLabel.textColor = UIColor.red
self.usernameLabel.text = "USERNAME TAKEN"
self.usernameTextField.layer.addBorder(edge: UIRectEdge.bottom, color: UIColor.red, thickness: 1.5)
return
}
}
self.usernameVerified = true
self.usernameTextField.layer.addBorder(edge: UIRectEdge.bottom, color: UIColor.black, thickness: 1.5)
self.usernameLabel.textColor = UIColor.black
self.usernameLabel.text = "USERNAME"
}) { (error) in
print(error.localizedDescription)
}
}
}
Функция, запускаемая после нажатия кнопки «Войти»:
@IBAction func onSignUp(_ sender: Any) {
isValidUsername(username: usernameTextField.text!)
isValidEmail(email: emailTextField.text!)
isValidPassword(password: passwordTextField.text!)
if passwordVerified && emailVerified && usernameVerified {
Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { (authResult, error) in
if error != nil {
self.errorLabel.alpha = 1
self.errorLabel.text = error?.localizedDescription
}
guard let user = authResult?.user else {
return
}
//Successfully Authenticated User
let ref = Database.database().reference(fromURL: "https://testapp-testtest.firebaseio.com/")
let usersReference = ref.child("users").child(user.uid)
let values = ["username": self.usernameTextField.text, "email": self.emailTextField.text]
let usernamesReference = ref.child("usernames")
let values2 = [self.usernameTextField.text!: user.uid]
usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in
if err != nil {
print(err!)
return
}
//Successfully registered user's data to database
usernamesReference.updateChildValues(values2, withCompletionBlock: { (err, ref) in
if err != nil {
print(err!)
return
}
self.errorLabel.alpha = 0
})
})
}
} else {
errorLabel.alpha = 1
print("Password/Email/Username verification not complete!")
}
}