2017-01-28 8 views
0

У меня есть 4 UITextFields в одном UIView как это:Автоматическое переключение между UITextFields с Swift

enter image description here

каждый 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 пуст.

+0

(1) [Не все кредитные карты имеют длину 16 цифр] (http://stackoverflow.com/a/19161529/224671) (2) Возможно, вы могли бы использовать [существующие ] (https://github.com/3lvis/FormTextField) [библиотеки] (https://stripe.github.io/stripe-ios/docs/Classes/STPPaymentCardTextField.html) вместо того, чтобы изобретать свои собственные. – kennytm

+0

Попробуйте этот ответ, это сработало для меня http://stackoverflow.com/a/39483754/6245319 –

+1

Мне лично не нравится вводить число в 4 отдельных текстовых поля :( – muescha

ответ

1

Добавить мишень для 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) 

чем создать селектор метод

Func 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{ 

    } 
} 
+0

Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и/или почему оно решает проблему, улучшит долгосрочную ценность ответа. – thewaywewere

0

сделать коллекцию выпускной всех текстовых полей и настройте их так:

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

Это будет изменение в одном из Ваши делегаты:

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

Уточненный вариант следующего ответа: How to move cursor from one text field to another automatically in swift ios programmatically?

 Смежные вопросы

  • Нет связанных вопросов^_^