Получение значения 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.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.