Примеры делегатов в Swift
Я пытался узнать, как работает делегирование с протоколами. Я все понял, но я не могу думать о том, когда использовать делегирование, кроме как при использовании табличных представлений и, возможно, прокрутки представлений.
Вообще, когда используется делегирование?
4 ответа
Что такое делегирование?
Прежде всего, вы должны знать, что паттерн делегирования не является эксклюзивным для мира iOS:
В разработке программного обеспечения шаблон делегирования является шаблоном проектирования в объектно-ориентированном программировании, который позволяет композиции объектов достигать того же повторного использования кода, что и наследование.
Но работа с делегированием в мире iOS настолько распространена, что я предполагаю, что вы можете увидеть множество классов, которые предоставляют делегирование / источник данных для предоставления возможности предоставлять свойства или поведения для используемого экземпляра. Это один из основных механизмов взаимодействия объектов в CocoaTouch.
Альтернативы:
Тем не менее, делегирование - это не единственный способ, позволяющий объектам взаимодействовать друг с другом в iOS. Возможно, вы захотите узнать, что есть:
- Центр уведомлений.
- КВО (Наблюдение ключевой стоимости).
- Завершение обработчиков / Обратные вызовы (используя замыкания).
- Цель-Действие.
Примечание: в случае, если вы заинтересованы в сравнении между ними, вы можете проверить следующие статьи:
- Шаблоны общения.
- Когда использовать делегирование, уведомление или наблюдение в iOS.
- Делегаты против наблюдателей.
Когда использовать делегирование?
Итак, вопрос: "Так почему я должен использовать делегирование вместо этих опций?"
Я постараюсь сделать это просто; Я бы предложил использовать делегирование, когда у вас есть отношения один к одному между двумя объектами. Чтобы было понятнее, цель небольшого разговора о NotificationCenter - попытаться понять смысл использования делегаций:
NotificationCenter представляет отношения один ко многим; Проще говоря, он работает следующим образом: публикует (уведомляет) уведомление о конкретном событии и наблюдает (получает уведомление о) это уведомление - его можно наблюдать где - либо еще; Логически, это то, что означает отношение один ко многим. Это представление паттерна наблюдателя.
Как подать заявку на делегирование?
В целях упрощения я бы упомянул это как шаги:
Знание требований: у каждого делегата есть свои собственные правила, перечисленные в протоколе делегата, который представляет собой набор сигнатур методов, которые вы должны реализовать для соответствия этому делегированию.
Соответствие для делегирования: это просто позволяет вашему классу быть делегатом, пометив его. Например:
class ViewController: UIViewController, UITableViewDelegate {}
,Соединение объекта делегата: маркировки вашего класса как делегата недостаточно, вам нужно убедиться, что объект, который вы хотите подтвердить вашим классом, предоставит требуемую работу вашему классу.
Реализация требований: Наконец, ваш класс должен реализовать все необходимые методы, перечисленные в протоколе делегата.
Например
Это звучит немного запутанно? Как насчет реального примера?
Рассмотрим следующий сценарий:
Представьте, что вы создаете приложение, связанное с проигрыванием аудио. Некоторые из viewControllers должны иметь вид аудиоплеера. В простейшем случае мы предполагаем, что он должен иметь кнопку воспроизведения / паузы и другую кнопку, скажем, для отображения списка воспроизведения, независимо от того, как он может выглядеть.
Пока все хорошо, вид аудио плеера имеет свои отдельные UIView
класс и .xib
файл; это должно быть добавлено как подпредставление в любом желаемом viewController.
Теперь, как вы можете добавить функциональность для обеих кнопок для каждого viewController? Вы можете подумать: "Просто я добавлю IBAction
в классе представления и на этом все ", на первый взгляд, это может звучать нормально, но, немного подумав, вы поймете, что это не будет применимо, если вы пытаетесь обработать событие касания кнопки в уровень контроллера; чтобы было понятно, что если каждый viewController реализует различные функции при нажатии кнопок в представлении аудиоплеера? Например: при нажатии на список воспроизведения в "A" viewController отобразит 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!!")
}
}
Быстрая подсказка:
Одним из наиболее популярных примеров использования делегирования является передача данных обратно между контроллерами представления.
Делегирование используется, когда вы хотите передать некоторую информацию или состояние объекта A другому объекту B. Обычно объект B - это объект, который создал объект A.
Я перечислю несколько ситуаций, когда вы будете использовать делегирование.
Да, ты прав. Табличные представления и представления прокрутки используют делегатов, потому что они хотят сказать всем, кто заинтересован (например, ваш контроллер представления), что "кто-то выбрал строку!" или "кто-то прокручивал представление прокрутки!". Мало того, что представления прокрутки и представления таблицы используют делегатов,
UITextField
а такжеUIDatePicker
и многие другие представления также используют делегатов!Контроллеры представления также имеют делегатов. Например,
UIImagePickerController
, Причина примерно такая же, как указано выше - потому чтоUIImagePickerController
хочет сказать вам сообщения типа "изображение было выбрано!" Другой пример будетUIPopoverControllerDelegate
, Этот делегат говорит вам такие вещи, как "поповер был уволен!"Другие классы, которые используют делегаты, включают
CLLocationManager
, Этот делегат говорит вам такие вещи, как "местоположение пользователя было обнаружено" или "не удалось определить местоположение пользователя".Вы можете использовать делегирование в своем коде, когда определенный ваш контроллер представления хочет отправлять сообщения другим контроллерам представления. Если это контроллер представления настроек, он может отправлять сообщения типа "настройка размера шрифта была изменена!" и контроллер представления, который заботится об изменении настройки размера шрифта, будет знать и изменять размер шрифта метки или чего-то еще.
Метод делегирования для выбора изображений
Создайте baseClass и вставьте следующий код
Создать другой класс и вставить код
Делегирование в мире IOS и, в основном, в MVC (Model View Controller) - это способ, с помощью которого View может взаимодействовать с контроллером, и это называется "слепое общение", а делегирование означает передачу "ведущей палки" другому объекту (на самом деле это не важно. кто берет на себя, но обычно контролер) для управления компонентами, которые представление не может контролировать самостоятельно (помните, что это только представление) или не владеет, чтобы сделать его более простым....
контроллер может общаться с представлением, но представление не может общаться с контроллером без делегирования