Что такое делегирование?
Прежде всего, вы должны знать, что шаблон делегирования не является эксклюзивным для мира iOS:
В программной инженерии шаблон делегирования - это шаблон проектирования в объектно-ориентированном программировании, который позволяет составлению объектов достичь того же повторного использования кода, что и наследование.
Но работа с делегированием в мире iOS настолько распространен, что я предполагаю, что вы можете увидеть многие классы, которые предоставляют делегирование / источник данных для предоставления возможности предоставлять свойства или поведение для используемого экземпляра. Это один из основных механизмов взаимодействия объектов друг с другом в CocoaTouch.
Альтернативы:
Однако делегирование - это не единственный способ разрешить объектам взаимодействовать друг с другом в iOS. Возможно, вы захотите знать, что есть:
Примечание: если вас интересует сравнение между ними, вы можете проверить следующие статьи:
Когда использовать делегирование?
Итак, возникает вопрос: «Так почему я должен использовать делегирование вместо этих параметров?»
Я постараюсь сделать это проще; Я бы посоветовал использовать делегирование, когда у вас есть отношения один к одному между двумя объектами. Чтобы было понятнее, цель немного поговорить о NotificationCenter - попытаться понять смысл использования делегирования:
NotificationCenter представляет собой отношение один ко многим; Проще говоря, это работает как: отправка (уведомление) уведомления о конкретном событии и наблюдение (получение уведомления) за этим уведомлением - его можно наблюдать где угодно < / em> else; По логике, это то, что означают отношения «один ко многим». Это представление шаблона наблюдателя.
Как подать заявку на делегирование?
Для упрощения я бы назвал это шагами:
Знание требований: каждый делегат имеет свои собственные правила, перечисленные в протоколе делегата, который представляет собой набор сигнатур методов, которые вы должны реализовать для соответствия эта делегация.
Соответствие для делегирования: это просто позволяет вашему классу быть делегатом, отмечая его. Например: class ViewController: UIViewController, UITableViewDelegate {}
.
Подключение объекта-делегата: пометить ваш класс как делегата недостаточно, вам нужно убедиться, что объект, который вы хотите, чтобы ваш класс подтвердил, предоставил требуемые работа для вашего класса.
Реализация требований: наконец, ваш класс должен реализовать все необходимые методы, перечисленные в протоколе делегата.
Например
Звучит немного запутанно? А как насчет реального примера?
Рассмотрим следующий сценарий:
Представьте, что вы создаете приложение, связанное с воспроизведением аудио. Некоторые из viewControllers должны иметь представление аудиопроигрывателя. В простейшем случае мы предполагаем, что у него должна быть кнопка воспроизведения / паузы и еще одна кнопка, скажем, для того, чтобы каким-то образом показать список воспроизведения, независимо от того, как он может выглядеть.
Пока все хорошо, в представлении аудиоплеера есть отдельные UIView
класс и .xib
файл; он должен быть добавлен как subview в любой желаемый viewController.
Теперь, как вы можете добавить функциональность к обеим кнопкам для каждого viewController? Вы можете подумать: «Просто я добавлю IBAction
в класс представления и все», на первый взгляд это может звучать нормально, но, немного подумав, вы поймете, что это не будет применимо, если вы пытаются обработать событие нажатия кнопки на уровне контроллера; Чтобы прояснить, что, если бы каждый viewController реализовал разные функции при нажатии кнопок в представлении аудиоплеера? Например: нажатие на список воспроизведения в viewController «A» отобразит tableView, но нажатие на него в viewController «B» отобразит средство выбора.
Что ж, давайте применим к этой проблеме делегирование:
Комментарии «#» представляют собой этапы «Как применить делегирование?» раздел.
Просмотр аудиоплеера:
// # 1: here is the protocol for creating the delegation
protocol AudioPlayerDelegate: class {
func playPauseDidTap()
func playlistDidTap()
}
class AudioPlayerView: UIView {
//MARK:- IBOutlets
@IBOutlet weak private var btnPlayPause: UIButton!
@IBOutlet weak private var btnPlaylist: UIButton!
// MARK:- Delegate
weak var delegate: AudioPlayerDelegate?
// IBActions
@IBAction private func playPauseTapped(_ sender: AnyObject) {
delegate?.playPauseDidTap()
}
@IBAction private func playlistTapped(_ sender: AnyObject) {
delegate?.playlistDidTap()
}
}
Контроллер представления:
class ViewController: UIViewController {
var audioPlayer: AudioPlayerView?
// MARK:- Life Cycle
override func viewDidLoad() {
super.viewDidLoad()
audioPlayer = AudioPlayerView()
// # 3: the "AudioPlayerView" instance delegate will implemented by my class "ViewController"
audioPlayer?.delegate = self
}
}
// # 2: "ViewController" will implement "AudioPlayerDelegate":
extension ViewController: AudioPlayerDelegate {
// # 4: "ViewController" implements "AudioPlayerDelegate" requirments:
func playPauseDidTap() {
print("play/pause tapped!!")
}
func playlistDidTap() {
// note that is should do a different behavior in each viewController...
print("list tapped!!")
}
}
Совет.
Одним из наиболее популярных примеров использования делегирования является обратная передача данных между контроллерами представления.
person
Ahmad F
schedule
09.11.2016