【问题标题】:focusing a text field in swift快速聚焦文本字段
【发布时间】:2015-09-04 00:09:45
【问题描述】:

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

【问题讨论】:

  • 你在 textFieldDidBeginEditing 中写了什么?发布该代码
  • @iAnurag 我在这个控制器上没有 textFieldDidBeginEditing
  • 你如何管理你的文本字段代表?
  • @iAnurag 我还没有开始添加该功能。我对 swift 很陌生。有什么我应该在那里做的事情导致上述问题吗?
  • alertWithTitle() 是做什么的?

标签: ios swift textfield


【解决方案1】:

theTextFieldYouWant.becomeFirstResponder()

【讨论】:

    【解决方案2】:

    这对我有用:

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

    【讨论】:

    • 正如其他人所说,有更简洁的方法来处理所有这些,这是代码中的根本问题。我在这里所做的是稍微解开一些事情,并确保只有在解除警报后,出现错误的文本字段才获得焦点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多