Pobieranie wartości UITextField podczas wprowadzania naciśnięć klawiszy?

107

Powiedzmy, że mam następujący kod:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Chciałbym greetingLabelprzeczytać „Hello [nameTextField]”, gdy tylko użytkownik naciśnie dowolny klawisz.

Zasadniczo potrzebuję odpowiednika metody delegata Cocoa na iPhone'a controlTextDidChange.

Metoda textField:shouldChangeCharactersInRange:delegata jest wywoływana za każdym razem, gdy występuje naciśnięcie klawisza:

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

Argument łańcuchowy zwraca naciśnięty znak. Jednak rzeczywista textFieldwartość ( nameTextField.text) pozostaje pusta.

Czego tu brakuje? (Chciałbym nameTextFieldodzwierciedlić dokładny ciąg wprowadzony przez użytkownika do tej pory).

PlagueHammer
źródło

Odpowiedzi:

197

Okazuje się, że najłatwiej to zrobić za pomocą Interface Builder:

  • Dodaj IBAction (do ViewController, powiedzmy, jak w tym przypadku)
  • Ctrl-Kliknij (lub kliknij prawym przyciskiem myszy) na UITextField w Interface Builder
  • Połącz zdarzenie „Editing Changed” z IBAction właściciela pliku dodanym w pierwszym kroku.

Działa jak urok :) (nie mogę uwierzyć, że spędziłem nad tym wiele dni, a teraz zdaję sobie sprawę, że rozwiązanie było znacznie prostsze niż myślałem: P)

PlagueHammer
źródło
2
Dzięki! Używałem „Zmiana wartości”, tak jak w przypadku UISlidera itp. Ciekawe, że mieliby dwa zdarzenia, które wydają się mieć takie samo zachowanie.
wjl
1
Z jakiegoś powodu nadal chciałem to zrobić w sposób programowy ... ale poddałem się ... Ta metoda działa! Dziękuję za udostępnienie ... Widziałem to już wcześniej, ale po wielu dniach kodowania mój mózg przestał funkcjonować hehe.
Albert Renshaw
8
@AlbertRenshaw Ale możesz to zrobić w sposób programowy;) Po prostu graj [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];).
Vive
101

możesz zarejestrować akcję dla zdarzenia UIControlEventEditingChanges w polu tekstowym:

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

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

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

}

źródło
Czy istnieje sposób, aby określić to za pomocą programu Interface Builder?
PlagueHammer,
11

UITextFieldma powiadomienie, UITextFieldTextDidChangektóre będzie uruchamiane za każdym razem, gdy zmieni się tekst, jeśli się na to zarejestrujesz. Po prostu zarejestruj się na to powiadomienie iw metodzie wywołanej przez powiadomienie zmień tekst etykiety.

Aby dodać do tego, obiekt przekazany do programu obsługi powiadomień będzie miał tekst UITextField.

Mam nadzieję, że to pomoże.

lostInTransit
źródło