642 Stimmen

UITextField Textänderung Ereignis

Wie kann ich Textänderungen in einem textField erkennen? Die Delegatenmethode shouldChangeCharactersInRange funktioniert für irgendetwas, aber es hat meinen Bedarf nicht genau erfüllt. Denn solange es nicht YES zurückgibt, sind die textField-Texte für andere Beobachtermethoden nicht verfügbar.

z.B. in meinem Code calculateAndUpdateTextFields nicht den aktualisierten Text erhalten hat, hat der Benutzer getippt.

Gibt es eine Möglichkeit, etwas zu bekommen wie textChanged Java-Ereignishandler.

- (BOOL)textField:(UITextField *)textField 
            shouldChangeCharactersInRange:(NSRange)range 
            replacementString:(NSString *)string 
{
    if (textField.tag == kTextFieldTagSubtotal 
        || textField.tag == kTextFieldTagSubtotalDecimal
        || textField.tag == kTextFieldTagShipping
        || textField.tag == kTextFieldTagShippingDecimal) 
    {
        [self calculateAndUpdateTextFields];

    }

    return YES;
}

30voto

bikram sapkota Punkte 1064

Wir können das leicht konfigurieren von Storyboard , CTRL ziehen Sie die @IBAction und ändern Sie das Ereignis wie folgt:

enter image description here

15voto

Aviel Gross Punkte 9318

Ab iOS 14 ist es nicht mehr nötig, einen Selektor zu erstellen, Sie können eine UIAction stattdessen mit einem Verschluss:

let editingChanged = UIAction { _ in
    // Do something when text changes...
}
myTextField.addAction(editingChanged, for: .editingChanged)

15voto

Hindu Punkte 2844

Hier in der schnellen Version für dasselbe.

textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)

func textFieldDidChange(textField: UITextField) {

}

Gracias

13voto

Pauls Punkte 2549

Ich habe das Problem gelöst, indem ich das Verhalten von shouldChangeChractersInRange geändert habe. Wenn Sie NO zurückgeben, werden die Änderungen nicht intern von iOS übernommen. Stattdessen haben Sie die Möglichkeit, sie manuell zu ändern und nach den Änderungen irgendwelche Aktionen durchzuführen.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //Replace the string manually in the textbox
    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];
    //perform any logic here now that you are sure the textbox text has changed
    [self didChangeTextInTextField:textField];
    return NO; //this make iOS not to perform any action
}

11voto

kemicofa ghost Punkte 15084

Swift Version getestet:

//Somewhere in your UIViewController, like viewDidLoad(){ ... }
self.textField.addTarget(
        self, 
        action: #selector(SearchViewController.textFieldDidChange(_:)),
        forControlEvents: UIControlEvents.EditingChanged
)

Parameter erklärt:

self.textField //-> A UITextField defined somewhere in your UIViewController
self //-> UIViewController
.textFieldDidChange(_:) //-> Can be named anyway you like, as long as it is defined in your UIViewController

Fügen Sie dann die Methode, die Sie oben erstellt haben, in Ihre UIViewController :

//Gets called everytime the text changes in the textfield.
func textFieldDidChange(textField: UITextField){

    print("Text changed: " + textField.text!)

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X