Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.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在UITextFields之间自动切换_Ios_Iphone_Swift_Uitextfield_Uitextfielddelegate - Fatal编程技术网

Ios 使用Swift在UITextFields之间自动切换

Ios 使用Swift在UITextFields之间自动切换,ios,iphone,swift,uitextfield,uitextfielddelegate,Ios,Iphone,Swift,Uitextfield,Uitextfielddelegate,我在一个UIView中有4个UITextFields,如下所示: 每个UITextField限制为4个字符。我想在UITextFields之间实现一个自动切换,每个UITextField都有计数字符 我使用shouldChangeCharactersIn作为限制字符: func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String)

我在一个UIView中有4个UITextFields,如下所示:

每个UITextField限制为4个字符。我想在UITextFields之间实现一个自动切换,每个UITextField都有计数字符

我使用shouldChangeCharactersIn作为限制字符:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let maxLength = 4
        var newString = String()
        let currentString: NSString = textField.text! as NSString
        newString = currentString.replacingCharacters(in: range, with: string)

        return newString.length <= maxLength
    }
我的问题是在删除文本时切换到上一个UITextField,当UITextField为空时,我无法检测退格事件。

在viewDidLoad中为textField添加目标

然后创建选择器方法

func textfield didchangetextfield:UITextField{

    let text = textField.text

    if text?.utf16.count == 1{
        switch textField{
        case firstTxt:
            secTxt.becomeFirstResponder()
        case secTxt:
            thirdTxt.becomeFirstResponder()
        case thirdTxt:
            fourTXt.becomeFirstResponder()
        case fourTXt:
            fourTXt.resignFirstResponder()
        default:
            break
        }
    }else{

    }
}

创建所有文本字段的outlet集合,并按如下方式进行配置:

OutletCollection:
@IBOutlet var textfields: [UITextField]!
在viewDidLoad中添加以下内容:
for (i, tf) in textfields.enumerated() {
    tf.layer.cornerRadius = 5
    tf.clipsToBounds = true
    tf.tag = i
    tf.delegate = self
}
在目标函数中,您将以以下方式限制计数:

func textFieldDidChange(textField: UITextField) {
       let text = textField.text!
       if text.utf16.count >= 4 {
           if textField.tag < 4 {
               codeTextfields[textField.tag + 1].becomeFirstResponder()
           }
           else {
               textField.resignFirstResponder()
           }
       }
}

以下答案的精练版本:

1 2也许你可以用它来代替自己的发明。试试这个答案,这对我来说很有效。我个人不喜欢在4个单独的文本字段中输入数字:例如,在这4个文本字段中,从我的1密码粘贴信用卡是不可能的:虽然这段代码可以回答这个问题,但前提是g关于如何和/或为什么解决问题的附加上下文将提高答案的长期值。如上所述,每个UITextField都有一个选择器,可自行调用,当文本将更改时,它将计算字符数,当满足条件时,它将更改为下一个UITextField
for (i, tf) in textfields.enumerated() {
    tf.layer.cornerRadius = 5
    tf.clipsToBounds = true
    tf.tag = i
    tf.delegate = self
}
func textFieldDidChange(textField: UITextField) {
       let text = textField.text!
       if text.utf16.count >= 4 {
           if textField.tag < 4 {
               codeTextfields[textField.tag + 1].becomeFirstResponder()
           }
           else {
               textField.resignFirstResponder()
           }
       }
}
func textFieldDidBeginEditing(_ textField: UITextField) {
        textField.text = ""
}