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