UITextFieldDelegate против событий элемента управления UITextField - PullRequest
9 голосов
/ 07 февраля 2011

Если я хочу обработать изменения в UITextField, такие как пользователь, набирающий его; Похоже, что это можно сделать либо путем назначения делегата этому текстовому полю, а затем с помощью делегата реализовать shouldChangeCharactersInRange, либо путем добавления цели в textField и обработки события UIControlEventEditingChanged.

Помимо того факта, что с помощью метода делегата вы можете вернуть NO и тем самым помешать пользователю выполнить редактирование, есть ли разница между этими двумя вещами?

Тот же вопрос для обработки начала редактирования или окончания редактирования. Это может быть сделано либо с соответствующими методами делегата, либо с соответствующими событиями. Для чего на самом деле делегат textField, если управляющие события могут выполнять необходимую работу?

Ответы [ 5 ]

9 голосов
/ 25 февраля 2011

shouldChangeCharactersInRange вызывается до того, как произойдет изменение, и дает вам возможность «отменить» изменение. UIControlEventEditingChanged вызывается после изменения.

Вы можете определить результирующее значение textField в shouldChangeCharactersInRange, но вам нужно вручную применить replaceString к существующему тексту, используя предоставленный диапазон. (через NSString stringByReplacingCharactersInRange). Если вы хотите узнать полученный текст, проще и эффективнее использовать UIControlEventEditingChanged.

shouldChangeCharactersInRange часто используется для проверки правильности ввода - то есть вы можете фильтровать символы / вставленный текст по мере ввода. Например, если поле предназначено для телефонных номеров, вы можете вернуть FALSE, если пользователь вводит не числовой символ или пытается вставить текст, который не является числовым.

Вы можете найти случай, когда вы можете повторно использовать код для нескольких элементов управления, если вы можете придерживаться UIControlEvent-methods.

6 голосов
/ 04 июня 2012

Одно ключевое различие, которое я обнаружил между двумя подходами, изложенными в исходном вопросе, заключается в том, что делегат "shouldChangeCharactersInRange" вызывается ДО , значение в UITextField изменяется.Цель для UIControlEventEditingChanged вызывается ПОСЛЕ , значение в UITextField изменяется.

В случае, если вы используете эти события, чтобы убедиться (например), что все поля в диалоговом окне полностью заполнены перед включением кнопки «Готово», целевой подход может работать лучше для вас.Это для меня.

6 голосов
/ 22 февраля 2011

Ты прав; по сути, вы можете делать одно и то же с помощью обоих, но UIControl является более низким уровнем и позволяет вам перенаправлять каждый конкретный UIEvent к различным целям через [UIControl addTarget:action:forControlEvents:], поскольку существует только один делегат.

Я бы также сказал, что протокол делегата UITextField просто существует как более удобная альтернатива UIControl / UIEvent более высокого уровня как способ управления поведением UITextField.

Самым распространенным шаблоном делегата являются UITableView DataSource и Delegate, и я бы сказал, что использование протокола делегирования UITextField весьма схоже и поэтому выглядит гораздо более прямолинейным с более определенными намерениями, чем передача сообщений из UIControl напрямую.

1 голос
/ 01 ноября 2011

Делегированный подход - это способ гомогенизировать поведение UITextField и UITextView.

UITextView не имеет событий управления. Напротив, UITextFieldDelegate и UITextviewDelegate предоставляют параллельные методы.

0 голосов
/ 16 ноября 2011

Я обнаружил, что shouldChangeCharactersInRange проходит то же самое NSRange для вставки и удаления текста.Вы добавляете пробел, а затем удаляете его, и параметры из shouldChangeCharactersInRange неотличимы от дублирования текста.

Таким образом, shouldChangeCharactersInRange фактически не может предсказать полученный текст.

...