集中一个文本字段在迅速

我有一个注册屏幕上的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 } 

在最后的文本字段的返回,我打电话检查错误function(下面)。 在那里,如果任何领域的问题,我想专注于该文本字段,以便用户可以轻松地纠正它。 发生的事情是,出现错误的文本字段正在关注(按照checkForErrors函数的指示)一秒钟,然后焦点切换回密码文本字段。 我也尝试将self.passwordField.resignFirstResponder()添加到上述函数的最后一个,这使得密码字段失去焦点,但随后遇到的问题的文本字段是根本没有获得焦点(甚至不是一秒钟之前)我怎样才能解决这个问题?

 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委托。

警告标题function按要求:

 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) } 

这适用于我:

 import UIKit class ViewController:UIViewController, UITextFieldDelegate { @IBOutlet weak var fNameField: UITextField! @IBOutlet weak var sNameField: UITextField! @IBOutlet weak var emailField: UITextField! @IBOutlet weak var passwordField: UITextField! override func viewDidLoad() { super.viewDidLoad() fNameField.delegate = self sNameField.delegate = self emailField.delegate = self passwordField.delegate = self } func isValidEmail (test:String) ->Bool{ // your email validation here... return true } func textFieldShouldReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() if (textField == self.fNameField) { 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 } 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, toFocus:self.fNameField) } else if sNameField.text.isEmpty { errors = true message += "Surname empty" alertWithTitle(title, message: message, ViewController: self, toFocus:self.sNameField) self.sNameField.becomeFirstResponder() } else if emailField.text.isEmpty { errors = true message += "Email empty" alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField) } else if !isValidEmail(emailField.text) { errors = true message += "Invalid Email Address" alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField) } else if passwordField.text.isEmpty { errors = true message += "Password empty" alertWithTitle(title, message: message, ViewController: self, toFocus:passwordField) } else if count(passwordField.text.utf16)<8 { errors = true message += "Password must be at least 8 characters" alertWithTitle(title, message: message, ViewController: self, toFocus:self.passwordField) } return errors } func alertWithTitle(title: String!, message: String, ViewController: UIViewController, toFocus:UITextField) { let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert) let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel,handler: {_ in toFocus.becomeFirstResponder() }); alert.addAction(action) ViewController.presentViewController(alert, animated: true, completion:nil) } }