当用户输入用户名时,我试图检查用户名是否被使用。目前,我有两个功能,它们的工作方式几乎与我所希望的一样,但不是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)
}
}
}
}
}
问题:--如果你输入的东西速度很快,或者你的互联网连接不太好,它会显示Username is not taken
,而实际上是这样。
如果你看一下Instagram-App,他们的做法是完美的:
loading indicator
,只有当用户名loading indicator
处于活动状态时才会得到反馈,它就会停止,只有当您再次停止键入时,才会再次启动。G 214
我的问题是:我如何意识到这一点??比如,我如何知道用户何时“停止”输入,但textField
仍然是editing
?我用shouldEndEditing
试过了,但只有当textfield
不再被选中时才能工作,这不是我想要实现的。最后,我希望有完全相同的过程,在Instagram应用程序。
关于如何实现这一点,有什么想法吗?
发布于 2020-03-04 15:51:08
有了@Jays的建议,我才能让它发挥作用:
我的textField
与如下所示的didChange
方法连接:
timer.invalidate() // reset timer
// start the timer
timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
连接的timerAction
-method如下所示:
// called every time interval from the timer
@objc func timerAction() {
checkUsername(field: usernameTextField.text!) { (success) in
print(self.usernameTextField.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"
// stop timer
self.timer.invalidate()
} else {
// username is not taken
print("Username is not taken")
// stop timer
self.timer.invalidate()
}
}
}
完全按照我希望的方式工作,谢谢您的帮助:)
https://stackoverflow.com/questions/60526269
复制