Я пытаюсь проверить, не занято ли имя пользователя, пока пользователь вводит имя. В настоящее время у меня есть эти две функции, которые работают почти так, как я хотел бы, чтобы они работали, но не на 100% правильно:
textFieldDidChange
:
@objc private func textFieldDidChange(_ textField: UITextField) {
switch textField {
// ... //
case usernameTextField:
if textField.text?.isEmpty == false {
checkUsername(field: textField.text!) { (success) in
print(textField.text!)
if success == true {
// username is taken
print("Username is taken")
self.setupUsernameTextField()
self.checkUsernameImage.image = UIImage(named: "false")
self.checkUserNameLabel.text = "Benutzername ist bereits vergeben"
} else {
// username is not taken
print("Username is not taken")
self.checkUsernameImage.image = UIImage(named: "correct")
self.checkUserNameLabel.text = "gültiger Benutzername"
}
}
}else {
self.checkUsernameImage.image = UIImage(named: "false")
self.checkUserNameLabel.text = "kein gültiger Benutzername"
}
default:
break
}
}
// helper function to check if username is in databse -> later in Datahandler
func checkUsername(field: String, completion: @escaping (Bool) -> Void) {
let db = Firestore.firestore()
let collectionRef = db.collection("users")
collectionRef.whereField("username", isEqualTo: field).getDocuments { (snapshot, err) in
if let err = err {
print("Error getting document: \(err)")
} else if (snapshot?.isEmpty)! {
completion(false)
} else {
for document in (snapshot?.documents)! {
if document.data()["username"] != nil {
completion(true)
}
}
}
}
}
Проблема: Если вы набираете что-то довольно быстро или если ваше соединение inte rnet не очень хорошее, оно отображает Username is not taken
, когда оно действительно есть.
Если вы посмотрите на Instagram-приложение, они делают это идеальным способом:
- введите что-то, даже быстрое
- после того, как вы перестанете печатать, возможно, через секунду появляется
loading indicator
, и только после этого вы получаете обратную связь, если имя пользователя не занято - введите что-то, пока
loading indicator
активен, он останавливается и запускается снова, если вы перестанете печатать снова.
Мой вопрос: как я это понимаю ??? Например, как узнать, когда пользователь «прекращает» печатать, но textField
по-прежнему editing
? Я попробовал это с shouldEndEditing
, но это работает, только если textfield
больше не выбран, и это не то, чего я хотел бы достичь. В конце я хотел бы иметь тот же процесс, что и в приложении Instagram.
Любые идеи о том, как это реализовать ??