我在注册屏幕上有 4 个文本字段,我将其设置为当用户在每个文本字段上按“下一步”时,下一个文本字段将获得焦点。代码如下:
func textFieldShouldReturn(textField: UITextField) -> Bool {
if (textField == self.fNameField) {
textField.resignFirstResponder()
self.sNameField.becomeFirstResponder()
}
else if (textField == self.sNameField) {
self.emailField.becomeFirstResponder()
} else if (textField == self.emailField) {
self.passwordField.becomeFirstResponder()
}
else {
var thereWereErrors = checkForErrors()
if !thereWereErrors
{
//conditionally segue to next screen
}
}
return true
}
在返回最终文本字段时,我调用错误检查函数(如下)。在其中,如果任何字段存在问题,我想集中该文本字段,以便用户可以轻松更正它。发生的情况是,有错误的文本字段聚焦(按照 checkForErrors 函数的指示)一秒钟,但随后焦点切换回密码文本字段。我也尝试添加self.passwordField.resignFirstResponder()
进入上述函数的最后一个 else ,这使得密码字段失去焦点,但遇到问题的文本字段根本没有获得焦点(甚至没有像以前那样一秒钟)我该如何解决这个问题?
func checkForErrors() -> Bool
{
var errors = false
let title = "Error"
var message = ""
if fNameField.text.isEmpty {
errors = true
message += "First name empty"
alertWithTitle(title, message: message, ViewController: self)
self.fNameField.becomeFirstResponder()
}
else if sNameField.text.isEmpty
{
errors = true
message += "Surname empty"
alertWithTitle(title, message: message, ViewController: self)
self.sNameField.becomeFirstResponder()
}
else if emailField.text.isEmpty
{
errors = true
message += "Email empty"
alertWithTitle(title, message: message, ViewController: self)
self.emailField.becomeFirstResponder()
}
else if !isValidEmail(emailField.text)
{
errors = true
message += "Invalid Email Address"
alertWithTitle(title, message: message, ViewController: self)
self.emailField.becomeFirstResponder()
}
else if passwordField.text.isEmpty
{
errors = true
message += "Password empty"
alertWithTitle(title, message: message, ViewController: self)
self.passwordField.becomeFirstResponder()
}
else if count(passwordField.text.utf16)<8
{
errors = true
message += "Password must be at least 8 characters"
alertWithTitle(title, message: message, ViewController: self)
self.passwordField.becomeFirstResponder()
}
return errors
}
注意我已经包含了 textField 委托。
根据要求带有标题功能的警报:
func alertWithTitle(title: String!, #message: String, #ViewController: UIViewController) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
let action = UIAlertAction(title: "OK", style: .Cancel, handler: nil)
alert.addAction(action)
ViewController.presentViewController(alert, animated: true, completion: nil)
}