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

Załóżmy, że mam następujący kod:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Chciałbym, aby greetingLabel przeczytało " Hello [nameTextField]", gdy tylko użytkownik naciśnie dowolny klawisz.

To, czego potrzebuję, to w zasadzie iPhone odpowiednik metody Cocoa delegate controlTextDidChange.

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

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

Argument string zwraca wciśnięty znak. Rzeczywista wartość textField (nameTextField.text) pozostaje jednak pusta.

Co mi tu umyka? (I ' d jak nameTextField, aby odzwierciedlić dokładny ciąg znaków, który użytkownik wprowadził do tej pory).

Author: jszumski, 2008-12-23

3 answers

Okazuje się, że najprostszym sposobem na to jest użycie Interface Builder:

  • Dodaj IBAction (do Viewcontrollera, powiedzmy, jak w tym przypadku)
  • Ctrl-kliknij (lub kliknij prawym przyciskiem myszy) na polu UITextField w Interface Builder
  • Połącz Zdarzenie" Editing Changed " z akcją właściciela pliku dodaną w pierwszym kroku.

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

 192
Author: PlagueHammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-23 10:26:52

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];

}
 101
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-23 08:19:22

UITextField posiada powiadomienie UITextFieldTextDidChange, które będzie wywoływane za każdym razem, gdy zmieni się tekst, jeśli się do niego zarejestrujesz. Wystarczy zarejestrować się do tego powiadomienia i w metodzie wywołanej przez powiadomienie zmienić tekst etykiety.

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

Mam nadzieję, że to pomoże.
 10
Author: lostInTransit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-22 19:18:03