Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在swift中聚焦文本字段_Ios_Swift_Textfield - Fatal编程技术网

Ios 在swift中聚焦文本字段

Ios 在swift中聚焦文本字段,ios,swift,textfield,Ios,Swift,Textfield,我在一个注册屏幕上有4个文本字段,我设置了它,这样当用户在每个文本字段上按next时,下一个文本字段就会被聚焦。代码如下: func textFieldShouldReturn(textField: UITextField) -> Bool { if (textField == self.fNameField) { textField.resignFirstResponder() self.sNameField.becomeF

我在一个注册屏幕上有4个文本字段,我设置了它,这样当用户在每个文本字段上按next时,下一个文本字段就会被聚焦。代码如下:

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函数(如下)。其中,如果任何字段出现问题,我希望将焦点放在该文本字段上,以便用户可以轻松更正它。发生的情况是,出现错误的文本字段正在聚焦(按照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
    }
这对我很有用:

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

}
导入UIKit
类ViewController:UIViewController、UIExtFieldDelegate{
@IBOutlet弱变量fNameField:UITextField!
@IBOutlet弱var sNameField:UITextField!
@IBOutlet弱var emailField:UITextField!
@IBOUTLE弱var密码字段:UITextField!
重写func viewDidLoad(){
super.viewDidLoad()
fNameField.delegate=self
sNameField.delegate=self
emailField.delegate=self
passwordField.delegate=self
}
func isValidEmail(测试:字符串)->Bool{
//您的电子邮件验证在此。。。
返回真值
}
func textField应返回(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()
}
否则{
var therewererrors=checkForErrors()
如果!有错误
{
//有条件地切换到下一屏幕
}
}
返回真值
}
func checkForErrors()->Bool
{
var错误=错误
让title=“错误”
var message=“”
如果fNameField.text.isEmpty{
错误=真
消息+=“名字为空”
alertWithTitle(标题、消息:消息、ViewController:self、toFocus:self.fNameField)
}
否则,如果sNameField.text.isEmpty
{
错误=真
消息+=“姓氏为空”
alertWithTitle(标题、消息:消息、视图控制器:self、toFocus:self.sNameField)
self.sNameField.becomeFirstResponder()
}
如果emailField.text.i为空,则为else
{
错误=真
消息+=“电子邮件为空”
alertWithTitle(标题、消息:消息、ViewController:self、toFocus:self.emailField)
}
else if!isValidEmail(emailField.text)
{
错误=真
消息+=“无效的电子邮件地址”
alertWithTitle(标题、消息:消息、ViewController:self、toFocus:self.emailField)
}
如果passwordField.text.i为空,则为else
{
错误=真
消息+=“密码为空”
alertWithTitle(标题、消息:消息、ViewController:self、toFocus:passwordField)
}

否则如果计数(passwordField.text.utf16)
所需的文本字段。成为第一响应者()

你在textFieldDidBeginEditing中写了什么?发布那个code@iAnurag我没有这个控制器上的textfield DidBeginediting你是如何管理你的textfield代理的?@iAnurag我还没有时间添加这个功能。我对swift非常陌生。我应该在那里做些什么导致abov出现问题e?什么是
alertWithTitle()
做的?正如其他人所说,有更干净的方法来处理所有这些问题,这是代码中的根本问题。我在这里做的是稍微理清一些事情,确保带有错误的文本字段只有在警报解除后才得到关注。
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)
    }

}