Swift 达到字符限制时切换到下一个UITextField

Swift 达到字符限制时切换到下一个UITextField,swift,string,uitextfield,Swift,String,Uitextfield,我要在电话号码中输入三个文本字段。我试图将每个文本字段的字符限制设置为三个字符,一旦达到这个限制,就切换到一个新的文本字段 我在网上看到使用此代码限制字符: func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let currentCharacterCount = textField

我要在电话号码中输入三个文本字段。我试图将每个文本字段的字符限制设置为三个字符,一旦达到这个限制,就切换到一个新的文本字段

我在网上看到使用此代码限制字符:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let currentCharacterCount = textField.text?.characters.count ?? 0
    if (range.length + range.location > currentCharacterCount){
        return false
    }
    let newLength = currentCharacterCount + string.characters.count - range.length
    return newLength <= 25
}

但我不知道如何将文本字段限制为3个字符,然后切换到下一个字段。

您可以使用
UITextField
shouldChangeCharactersInRange
的委托方法。不过,您需要做一些设置工作。下面是一个创建3个文本字段的示例,它符合
UITextFieldDelegate
,并执行与您描述的类似的操作

class ViewController: UIViewController, UITextFieldDelegate {


var max = 3
var fields:[UITextField] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    // This is just an example to layout 3 text fields.
    for i in 0 ..< 3 {
        let field = UITextField()
        view.addSubview(field)
        field.delegate = self
        field.borderStyle = .roundedRect
        field.font = UIFont(name: "AvenirNext-Regular", size: 15.0)
        field.textColor = UIColor.black
        field.frame = CGRect(x: view.bounds.width/2 - 100, y: 100 + (150*CGFloat(i)), width: 200, height: 50)
        fields.append(field)
    }


}

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // Make sure the field has non-nil text
    if let text = textField.text {
        // Check if the text length has reached max limit
        if text.characters.count > (max-1) {
            // Get index of field from fields array
            if let index = fields.index(of: textField) {
                // Make sure it's not the last field in the array else return false
                if index < fields.count-1 {
                    // Make the next field in the array become first responder if it's text is non-nil and it's text's character count is less than desired max
                    if fields[index+1].text != nil && fields[index+1].text!.characters.count < (max-1) {
                        fields[index+1].becomeFirstResponder()
                    } else {
                        return false
                    }
                } else {
                    return false
                }
            }
        }
    }
    return true
}

}
类ViewController:UIViewController、UIExtFieldDelegate{
var max=3
变量字段:[UITextField]=[]
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后,通常从nib执行任何其他设置。
//这只是一个布局3个文本字段的示例。
对于0..<3中的i{
let field=UITextField()
视图.添加子视图(字段)
field.delegate=self
field.borderStyle=.roundedRect
field.font=UIFont(名称:“AvenirNext常规”,大小:15.0)
field.textColor=UIColor.black
field.frame=CGRect(x:view.bounds.width/2-100,y:100+(150*CGFloat(i)),宽度:200,高度:50)
字段。追加(字段)
}
}
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
//确保该字段具有非零文本
如果let text=textField.text{
//检查文本长度是否达到最大限制
如果text.characters.count>(最大值为1){
//从字段数组中获取字段的索引
如果let index=fields.index(of:textField){
//确保它不是数组中的最后一个字段,否则返回false
如果索引
您可以对
UITextField
shouldchangeCharactersRange
使用委托方法。不过,您需要做一些设置工作。下面是一个创建3个文本字段的示例,它符合
UITextFieldDelegate
,并执行与您描述的类似的操作

class ViewController: UIViewController, UITextFieldDelegate {


var max = 3
var fields:[UITextField] = []

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    // This is just an example to layout 3 text fields.
    for i in 0 ..< 3 {
        let field = UITextField()
        view.addSubview(field)
        field.delegate = self
        field.borderStyle = .roundedRect
        field.font = UIFont(name: "AvenirNext-Regular", size: 15.0)
        field.textColor = UIColor.black
        field.frame = CGRect(x: view.bounds.width/2 - 100, y: 100 + (150*CGFloat(i)), width: 200, height: 50)
        fields.append(field)
    }


}

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // Make sure the field has non-nil text
    if let text = textField.text {
        // Check if the text length has reached max limit
        if text.characters.count > (max-1) {
            // Get index of field from fields array
            if let index = fields.index(of: textField) {
                // Make sure it's not the last field in the array else return false
                if index < fields.count-1 {
                    // Make the next field in the array become first responder if it's text is non-nil and it's text's character count is less than desired max
                    if fields[index+1].text != nil && fields[index+1].text!.characters.count < (max-1) {
                        fields[index+1].becomeFirstResponder()
                    } else {
                        return false
                    }
                } else {
                    return false
                }
            }
        }
    }
    return true
}

}
类ViewController:UIViewController、UIExtFieldDelegate{
var max=3
变量字段:[UITextField]=[]
重写func viewDidLoad(){
super.viewDidLoad()
//加载视图后,通常从nib执行任何其他设置。
//这只是一个布局3个文本字段的示例。
对于0..<3中的i{
let field=UITextField()
视图.添加子视图(字段)
field.delegate=self
field.borderStyle=.roundedRect
field.font=UIFont(名称:“AvenirNext常规”,大小:15.0)
field.textColor=UIColor.black
field.frame=CGRect(x:view.bounds.width/2-100,y:100+(150*CGFloat(i)),宽度:200,高度:50)
字段。追加(字段)
}
}
func textField(textField:UITextField,shouldChangeCharacters范围:NSRange,replacementString:string)->Bool{
//确保该字段具有非零文本
如果let text=textField.text{
//检查文本长度是否达到最大限制
如果text.characters.count>(最大值为1){
//从字段数组中获取字段的索引
如果let index=fields.index(of:textField){
//确保它不是数组中的最后一个字段,否则返回false
如果索引
这是我的代码,我如何解决这个问题:

这三个文本字段是:

@IBOutlet var txtField1: UITextField!
@IBOutlet var txtField2: UITextField!
@IBOutlet var txtField3: UITextField!
UITextFieldDelegate
导入到类中,并将所有文本字段的委托设置为self

并使用此方法改变焦点

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let currentCharacterCount = ((textField.text?.characters.count)! + string.characters.count) - 1

    switch (textField, currentCharacterCount) {
    case (self.txtField1, 3):
        self.txtField2.becomeFirstResponder()
    case (self.txtField2, 7):
        self.txtField3.becomeFirstResponder()
    default:
        break
    }

    return true
}

这里我为第一个文本字段设置字符计数3,为第二个文本字段设置字符计数7。

这是我的代码,我如何解决这个问题:

这三个文本字段是:

@IBOutlet var txtField1: UITextField!
@IBOutlet var txtField2: UITextField!
@IBOutlet var txtField3: UITextField!
UITextFieldDelegate
导入到类中,并将所有文本字段的委托设置为self

并使用此方法改变焦点

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let currentCharacterCount = ((textField.text?.characters.count)! + string.characters.count) - 1

    switch (textField, currentCharacterCount) {
    case (self.txtField1, 3):
        self.txtField2.becomeFirstResponder()
    case (self.txtField2, 7):
        self.txtField3.becomeFirstResponder()
    default:
        break
    }

    return true
}
这里我为第一个文本字段设置字符计数3,为第二个文本字段设置字符计数7