it-swarm.com.ru

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

Допустим, у меня есть следующий код:

IBOutlet UITextField* nameTextField;
IBOutlet UILabel* greetingLabel;

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

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

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

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

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

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

107
PlagueHammer

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

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

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

195
PlagueHammer

вы можете зарегистрировать действие для события UIControlEventEditingChanges в текстовом поле:

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

...

// TODO: error checking

- (void)updateLabelUsingContentsOfTextField:(id)sender {

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

}
101
Ax

UITextField имеет уведомление UITextFieldTextDidChange, которое будет запускаться при каждом изменении текста, если вы зарегистрируетесь для него. Просто зарегистрируйтесь для этого уведомления и в методе, вызванном уведомлением, измените текст метки.

Чтобы добавить к этому, объект, переданный вашему обработчику уведомлений, будет иметь текст UITextField.

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

10
lostInTransit