2016-07-29 12 views
3

Ich habe eine Reihe von textfields in einer einzigen Zeile. Jeder textfield ist auf zwei Zeichen begrenzt.Swift UITextField deleteBackward Ausgabe

Mein Problem ist, dass ich alle Zeichen löschen und zurück durch alle textfields gehen will, bis ich an die erste textfield.

Ich habe das Textfeld subclassiert und die Methode deleteBackward überschrieben, um festzustellen, ob der Text im Textfeld leer ist. Wenn ja, ändern Sie den Responder in das vorherige Textfeld.

Das ist alles in Ordnung, aber wenn ein Zeichen im Textfeld steht und die Rücktaste gedrückt wird, wird das Zeichen gelöscht und der Responder wird in das vorherige Textfeld geändert.

Das ist falsches Verhalten, da ich möchte, dass der Fokus auf dem Textfeld bleibt, dessen Zeichen gelöscht wurde, und wenn die Löschtaste erneut gedrückt wird, sollte der Antwortende zum vorherigen Textfeld wechseln.

Ich korrigierte dies meine Einstellung ein Flag in der sentChangeCharacters Delegate-Methode des Textfelds. Die Flagge wird auf true gesetzt, wenn ...

if (newLength == 0 && currentLength == 0) || currentLength == 0 { 
    textFieldEmpty = true 
} else { 
    textFieldEmpty = false 
} 

Dies funktioniert gut, aber wenn das Textfeld leer ist, und Backspace gedrückt wird, wird dieser Delegat Methode nicht aufgerufen?

Nur herumwandern, wenn jemand ein ähnliches Problem gelöst hat und welchen Ansatz sie genommen haben?

Dank

Antwort

0

Ich habe ein ähnliches Szenario, aber mit einzelnen Zeichen in jedem Textfeld ein. Ich habe deleteBackward auch in einem benutzerdefinierten Textfeld verwendet, um dies zu erreichen.

Versuchen Sie diesen Code:

import UIKit 
protocol CustomTextFieldDelegate{ 
func textFieldDidDelete() 
} 
class CustomTextField: UITextField { 
    var myCustomTextFieldDelegate : CustomTextFieldDelegate! 
    override func deleteBackward() { 
    super.deleteBackward() 
    myCustomTextFieldDelegate.textFieldDidDelete() 
} 
} 

Und das ist, wie Sie die deleteBackward Methode implementieren sollten:

func textFieldDidDelete() { 
    print("Entered Delete"); 
    print("Tag!!\(currentActiveTextField.tag)") 
    var previousTag = 0 
    if currentActiveTextField.text == ""{ 
     previousTag = currentActiveTextField.tag - 1 
    }else{ 
    previousTag = currentActiveTextField.tag 
    } 
    let previousResponder = currentActiveTextField.superview?.viewWithTag(previousTag) 
    if(previousTag > 0){ 
     let previousTextField = previousResponder as! CustomTextField 
     previousTextField.text = "" 
     currentActiveTextField = previousTextField 
     previousResponder?.becomeFirstResponder() 
    } 
} 

Auch in shouldChangeCharacters in Bereich Methode, vergessen Sie nicht, Ihre currentlyActiveTextField als das Textfeld festlegen Sie möchten bearbeiten. Überprüfen Sie den folgenden Code, möglicherweise helfen. Meine Textfelder haben Tags 1,2,3,4.

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    currentActiveTextField = textField as! CustomTextField 
    let nextTag = textField.tag + 1; 
    // get next responder 
    var nextResponder = textField.superview?.viewWithTag(nextTag); 


    // On inputing value to textfield 
    if (textField.text?.characters.count < 1 && string.characters.count > 0){ 

     if (nextResponder == nil){ 
      nextResponder = textField.superview?.viewWithTag(1); 
     } 
     textField.text = string; 

     if nextTag == 5 { 
      self.digitFourTextField.resignFirstResponder() 
      return true; 
     } 

     nextResponder?.becomeFirstResponder(); 
     return false; 
    } 
    if (textField.text?.characters.count >= 1 && string.characters.count == 0){ 
     // on deleteing value from Textfield 
     let presentTag = textField.tag; 
     // get next responder 
     var presentResponder = textField.superview?.viewWithTag(presentTag); 

     if (presentResponder == nil){ 
      presentResponder = textField.superview?.viewWithTag(1); 
     } 
     textField.text = ""; 
     presentResponder?.becomeFirstResponder(); 
     return false; 
    } 

    let currentCharacterCount = textField.text?.characters.count ?? 0 
    let newLength = currentCharacterCount + string.characters.count - range.length 
    if newLength > 1 { 
     textField.text = string 
     if (nextResponder != nil){ 
      nextResponder?.becomeFirstResponder(); 
     } 

    } 
    let returnVal = newLength <= 1 
    return returnVal; 
}