Автоматическое переключение между UITextFields с помощью Swift

У меня 4 UITextFields в одном UIView вот так:

введите здесь описание изображения

каждый 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
    }

и это мой инструмент переключения:

func textFieldDidChange(_ textField: UITextField){

    let text = textField.text

    if text?.utf16.count == 4 {
        switch textField {
        case firstPartTextField:
            secondPartTextField.becomeFirstResponder()
        case secondPartTextField:
            thirdPartTextField.becomeFirstResponder()
        case thirdPartTextField:
            fourthPartTextField.becomeFirstResponder()
        default:
            break
        }
    }
}

моя проблема заключается в переключении на предыдущий UITextField при удалении текстов, я не могу обнаружить событие backSpace, когда UITextField пусто.


person Mohammad Alikhani    schedule 28.01.2017    source источник
comment
(1) Не все кредитные карты имеют 16-значную длину (2) Возможно, вы могли бы использовать существующий библиотеки вместо того, чтобы изобретать свои собственные.   -  person kennytm    schedule 28.01.2017
comment
Попробуйте этот ответ, это сработало для меня stackoverflow.com/a/39483754/6245319   -  person Mohsen Hossein pour    schedule 28.01.2017
comment
мне лично не нравится вводить число в 4 отдельных текстовых поля :(   -  person muescha    schedule 29.01.2017
comment
например, вставка кредитной карты из моего 1Password невозможна с этими 4 текстовыми полями :(   -  person muescha    schedule 29.01.2017


Ответы (2)


Добавить цель для textField в viewDidLoad()

firstTxt.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
    secTxt.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
    thirdTxt.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
    fourTXt.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)

Чем создать метод выбора

функция textFieldDidChange (textField: 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{

    }
}
person AbhiRaz    schedule 19.06.2017
comment
Хотя этот код может дать ответ на вопрос, предоставление дополнительного контекста относительно того, как и/или почему он решает проблему, улучшит долгосрочную ценность ответа. - person thewaywewere; 19.06.2017
comment
Как и выше, у каждого UITextField был селектор, который вызывается сам по себе, и когда текст изменится, он будет считать символ, а когда он соответствует условию, он изменится на следующий UITextField. - person AbhiRaz; 22.11.2019

Создайте выходную коллекцию всех ваших текстовых полей и настройте их следующим образом:

OutletCollection:
@IBOutlet var textfields: [UITextField]!
Add this in 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()
           }
       }
}

Это изменит один из ваших методов делегата:

func textFieldDidBeginEditing(_ textField: UITextField) {
        textField.text = ""
}

Уточненная версия следующего ответа: Как программно переместить курсор из одного текстового поля в другое автоматически в swift ios?

person CoderSulemani    schedule 30.11.2017