Den Wert eines UITextField abrufen, wenn Tastenanschläge eingegeben werden?

107

Angenommen, ich habe den folgenden Code:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Ich möchte das greetingLabel"Hallo [nameTextField]" lesen, sobald der Benutzer eine beliebige Taste drückt.

Was ich im Grunde brauche, ist das iPhone-Äquivalent der Cocoa-Delegate-Methode controlTextDidChange.

Die textField:shouldChangeCharactersInRange:Delegate-Methode wird jedes Mal aufgerufen, wenn ein Tastenanschlag auftritt:

- (BOOL)              textField:(UITextField *)textField
  shouldChangeCharactersInRange:(NSRange)range     
              replacementString:(NSString *)string

Das Zeichenfolgenargument gibt das gedrückte Zeichen zurück. Der tatsächliche textFieldWert ( nameTextField.text) bleibt jedoch leer.

Was fehlt mir hier? (Ich möchte nameTextFielddie genaue Zeichenfolge wiedergeben, die der Benutzer bisher eingegeben hat).

PlagueHammer
quelle

Antworten:

197

Es stellt sich heraus, dass der einfachste Weg, dies zu tun, die Verwendung von Interface Builder ist:

  • Fügen Sie eine IBAction hinzu (z. B. wie in diesem Fall zum ViewController).
  • Klicken Sie bei gedrückter Strg-Taste (oder Rechtsklick) auf das UITextField im Interface Builder
  • Verbinden Sie das Ereignis "Bearbeiten geändert" mit der im ersten Schritt hinzugefügten IBAction des Eigentümers der Datei.

Funktioniert wie ein Zauber :) (Ich kann nicht glauben, dass ich viele Tage damit verbracht habe und jetzt zu erkennen, dass die Lösung viel einfacher war, als ich gedacht hatte: P)

PlagueHammer
quelle
2
Vielen Dank! Ich habe "Value Changed" verwendet, wie Sie es mit einem UISlider usw. verwenden würden. Interessant, dass sie zwei Ereignisse haben würden, die das gleiche Verhalten zu haben scheinen.
wjl
1
Aus irgendeinem Grund wollte ich immer noch einen programmatischen Weg, dies zu tun ... aber ich gab nach ... Diese Methode rockt! Danke fürs Teilen ... Ich hatte es schon einmal gesehen, aber nach Tagen des Codierens funktioniert mein Gehirn nicht mehr, hehe.
Albert Renshaw
8
@AlbertRenshaw Aber Sie können dies auf programmatische Weise tun;) Führen Sie einfach durch [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];).
Vive
101

Sie können eine Aktion für das Ereignis UIControlEventEditingChanges im Textfeld registrieren:

[nameTextField addTarget:self action:@selector(updateLabelUsingContentsOfTextField:) forControlEvents:UIControlEventEditingChanged];

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

    greetingLabel.text = [NSString stringWithFormat:@"Hello %@", ((UITextField *)sender).text];

}

quelle
Gibt es eine Möglichkeit, dies mit Interface Builder anzugeben?
PlagueHammer
11

UITextFieldhat eine Benachrichtigung, UITextFieldTextDidChangedie jedes Mal ausgelöst wird, wenn sich der Text ändert, wenn Sie sich dafür registrieren. Registrieren Sie sich einfach für diese Benachrichtigung und ändern Sie in der von der Benachrichtigung aufgerufenen Methode den Text des Etiketts.

Um dies hinzuzufügen, enthält das an Ihren Benachrichtigungshandler übergebene Objekt den Text des UITextField.

Hoffentlich hilft das.

lostInTransit
quelle