2016-03-23 2 views
0

Только что начал изучать Swift с помощью Xcode (после многих лет разработки .NET) и просматривал несколько видеороликов и заметил различные способы взаимодействия людей с элементами управления UI (например, UITextField). Три способа я видел являются:Swift - IBAction vs Delegate vs addTarget

  1. Иметь ViewController реализовать соответствующие средства управления делегата протокола (например, UITextFieldDelegate), а затем осуществить соответствующую функцию для требуемого события.
  2. Создайте IBAction от конструктора интерфейса.
  3. Программный провода вверх обработчик с controlName.addTarget (...)

Может кто-то пожалуйста, объясните, плюсы и минусы каждого подхода и один считаются ли лучше практиком, чем другие (и в этом случае является применимо)?

Любые идеи очень ценятся!

ответ

3

«Проводка» IBAction в раскадровке или xib эквивалентно добавлению цели программно и на самом деле является лишь вопросом предпочтения. Если вы собираетесь использовать раскадровки или xibs, распространенная практика заключается в том, чтобы подключить элементы управления только для облегчения поиска. Кроме того, вам необходимо подключить IBOutlet к элементам управления, к которым вы хотите иметь доступ в коде.

Методы делегатов на самом деле являются чем-то совершенно отличным от двух других вариантов, о которых вы упомянули.Например, у UITextFiled будет несколько свойств и действий, которые вы можете подключить напрямую, но есть несколько методов делегатов, которые вам нужно реализовать, чтобы воспользоваться большей частью функциональности, например, отвечать на каждый отдельный символ введенный пользователем.

Вот несколько руководств, иллюстрирующих wiring up и delegate methods.

0

Делегаты отлично подходят для отправки и получения данных между двумя объектами. Его можно использовать, чтобы классы явно соответствовали требуемым функциям протокола. Например, UITableView, его необходимо, чтобы вы хотя бы позволили TableView сколько строк, секций и каких ячеек заполнить в этих индексах.

1. Однако с UITextFieldDelegate его просто хороший способ документировать события, которые происходят.

2. IBAction доступен, только если вы делаете что-то через построитель интерфейсов. Он связывает действия, которые находятся внутри родительского класса UIControl (UITextField), чтобы вы могли получать пользовательские события ввода/действия и связывать их в коде. Использование IBAction упрощает ваш код (потому что для написания кода меньше кода)

3. controlName.addTarget (...) - это программный способ обработки ссылки IBAction. Моя рекомендация заключается в том, что вы собираетесь с помощью раскадровки/интерфейса с помощью IBAction. Легче, что, если вы удаляете объект с вашего раскадровки, он автоматически отключает цель/действие.

Установка целей на самом деле является частью класса UIControl, и если ваш тип объекта не основан на UIView (или что-то, что наследуется от UIControl), вы, очевидно, не можете использовать addTarget (...), но ваш вариант должен использовать пользовательский делегат/протокол.

UIControl обычно используется для указания объектов при изменении представления пользователем. События перечислены в этом document.

Схема дизайна делегирования/протокола намного более гибкая. Например, если вы хотите, чтобы пользователь не вводил символы, реализуя textField(textField:,shouldChangeCharactersInRange:,replacementString:) -> Bool, где, поскольку UIControl может действительно только сказать вам, было ли изменено текстовое поле.