将文本字段聚焦在 swift

focusing a text field in swift

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

在最后一个文本字段的 return 上,我正在调用错误检查功能(如下)。其中,如果任何字段有问题,我想关注该文本字段,以便用户可以轻松更正它。发生的事情是有错误的文本字段聚焦(如 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)
}

这对我有用:

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

}

theTextFieldYouWant.becomeFirstResponder()