Отримання значення UITextField під час введення клавіш?


107

Скажімо, у мене є такий код:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Я хотів би greetingLabelпрочитати "Привіт [nameTextField]", як тільки користувач натисне будь-яку клавішу.

Що мені в основному потрібно, це еквівалент iPhone методу делегата какао на iPhone controlTextDidChange.

Метод textField:shouldChangeCharactersInRange:делегування викликається кожного разу, коли відбувається натискання клавіші:

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

Аргумент рядка повертає натиснутий символ. Однак фактичне textFieldзначення ( nameTextField.text) залишається порожнім.

Що я тут пропускаю? (Я хотів би nameTextFieldвідобразити точний рядок, який користувач уже ввів).

Відповіді:


197

Виявляється, найпростіший спосіб зробити це за допомогою Interface Builder:

  • Додайте IBAction (скажімо, як у цьому випадку в ViewController)
  • Клацніть Ctrl (або клацніть правою кнопкою миші) на UITextField у програмі Interface Builder
  • Підключіть подію "Редагування змінено" до IBAction власника файлу, доданого на першому кроці.

Працює як шарм :) (Не можу повірити, що я витратив на це чимало днів, і тепер зрозумів, що рішення було набагато простіше, ніж я думав: P)


2
Дякую! Я використовував "Value Changed" так, як ви б використовували його з UISlider тощо. Цікаво, що у них відбудуться дві події, які, схоже, мають однакову поведінку.
wjl

1
Чомусь я все-таки хотів зробити це програмним шляхом ... але я поступився ... Цей метод Скелі! Дякую за обмін ... Я бачив це і раніше, але після днів кодування мій мозок вже не працює.
Альберт Реншо

8
@AlbertRenshaw Але це можна зробити програмно;) Просто виконайте [textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged];).
Vive

101

Ви можете зареєструвати дію для події UIControlEventEditingChanges у текстовому полі:

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

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

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

}

Чи є спосіб вказати це за допомогою Interface Builder?
PlagueHammer

11

UITextFieldмає повідомлення, UITextFieldTextDidChangeяке видаватиметься кожного разу, коли текст змінюється, якщо ви реєструєтесь на нього. Просто зареєструйтесь для цього сповіщення та в методі, викликаному сповіщенням, змініть текст мітки.

Щоб додати до цього, об’єкт, переданий вашому обробнику повідомлень, буде містити текст UITextField.

Сподіваюся, що це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.