2017-01-28 3 views
0

Ich habe 4 UITextFields in einem UIView wie folgt aus:automatische Umschaltung zwischen UITextFields mit Swift

enter image description here

jeweils UITextField begrenzt auf 4 Zeichen. Ich möchte eine automatische Umschaltung zwischen UITextFields mit Anzahl Zeichen von jedem UITextField implementieren.

i verwenden shouldChangeCharactersIn zur Begrenzung Zeichen:

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 
    } 

und das ist mein Schalt implementieren:

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

mein Problem ist, Schalter zur vorherigen UITextField Texte zu löschen, kann ich nicht die Rücktaste Ereignis erkennen, wenn UITextField ist leer.

+0

(1) [Nicht alle Kreditkarten sind 16-stellig lang] (http://stackoverflow.com/a/19161529/224671) (2) Vielleicht könnten Sie [existing ] (https://github.com/3lvis/FormTextField) [Bibliotheken] (https://stripe.github.io/stripe-ios/docs/Classes/STPPaymentCardTextField.html) statt eigene zu erfinden. – kennytm

+0

Versuchen Sie diese Antwort, das funktionierte für mich http://Stackoverflow.com/a/39483754/6245319 –

+1

Ich persönlich mag es nicht, eine Nummer in 4 separate Textfelder eingeben :( – muescha

Antwort

1

Add Ziel für Textfield in 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) 

als Selektor Methode

func textFieldDidChange (textfield: UITextField) erstellen {

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

Während dieser Code die Frage beantworten kann, würde die Bereitstellung zusätzlichen Kontext in Bezug darauf, wie und/oder warum es das Problem löst, den langfristigen Wert der Antwort verbessern. – thewaywewere

0

eine Steckdose Sammlung von allen Ihren Textfeldern und konfigurieren Sie sie wie folgt:

OutletCollection:
@IBOutlet var textfields: [UITextField]! 
Fügen Sie diese in viewDidLoad:
for (i, tf) in textfields.enumerated() { 
    tf.layer.cornerRadius = 5 
    tf.clipsToBounds = true 
    tf.tag = i 
    tf.delegate = self 
} 

In der Zielfunktion, werden Sie die Zählung auf diese Weise beschränken:

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

Dies wird die Änderung in einem der Ihre Delegiertenmethoden:

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

Raffinierte Version der folgenden Antwort: How to move cursor from one text field to another automatically in swift ios programmatically?

Verwandte Themen