Получение значения UITextField при вводе нажатий клавиш?

107

Скажем, у меня есть следующий код:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

Я бы хотел, greetingLabelчтобы он прочитал «Hello [nameTextField]», как только пользователь нажмет любую клавишу.

В основном мне нужен iPhone-эквивалент метода делегата Cocoa controlTextDidChange.

Метод textField:shouldChangeCharactersInRange:делегата вызывается каждый раз при нажатии клавиши:

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

Строковый аргумент возвращает нажатый символ. Однако фактическое textFieldзначение ( nameTextField.text) остается пустым.

Что мне здесь не хватает? (Я хотел бы nameTextFieldотразить точную строку, которую пользователь ввел до сих пор).

Чума
источник

Ответы:

197

Оказывается, самый простой способ сделать это - использовать Interface Builder:

  • Добавьте IBAction (скажем, в ViewController, как в этом случае)
  • Удерживая Ctrl (или щелкните правой кнопкой мыши) на UITextField в Интерфейсном Разработчике
  • Подключите событие «Редактирование изменено» к IBAction владельца файла, добавленному на первом шаге.

Работает как шарм :) (не могу поверить, что потратил на это много дней, и теперь понимаю, что решение было намного проще, чем я думал: P)

Чума
источник
2
Спасибо! Я использовал «Value Changed», как вы бы использовали с UISlider и т. Д. Интересно, что у них было бы два события, которые, кажется, имеют одинаковое поведение.
wjl 03
1
По какой-то причине мне все еще нужен был программный способ сделать это ... но я сдался ... Этот метод Rocks! Спасибо за то, что поделились ... Я видел это раньше, но после нескольких дней кодирования мой мозг больше не функционирует, хе-хе.
Альберт Реншоу
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.

Надеюсь, это поможет.

lostInTransit
источник