Примеры делегатов в Swift

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

В общем, когда используется делегирование?


person Nikhil Sridhar    schedule 09.11.2016    source источник


Ответы (4)


Что такое делегирование?

Прежде всего, вы должны знать, что шаблон делегирования не является эксклюзивным для мира iOS:

В программной инженерии шаблон делегирования - это шаблон проектирования в объектно-ориентированном программировании, который позволяет составлению объектов достичь того же повторного использования кода, что и наследование.

Но работа с делегированием в мире iOS настолько распространен, что я предполагаю, что вы можете увидеть многие классы, которые предоставляют делегирование / источник данных для предоставления возможности предоставлять свойства или поведение для используемого экземпляра. Это один из основных механизмов взаимодействия объектов друг с другом в CocoaTouch.


Альтернативы:

Однако делегирование - это не единственный способ разрешить объектам взаимодействовать друг с другом в iOS. Возможно, вы захотите знать, что есть:

Примечание: если вас интересует сравнение между ними, вы можете проверить следующие статьи:


Когда использовать делегирование?

Итак, возникает вопрос: «Так почему я должен использовать делегирование вместо этих параметров?»

Я постараюсь сделать это проще; Я бы посоветовал использовать делегирование, когда у вас есть отношения один к одному между двумя объектами. Чтобы было понятнее, цель немного поговорить о NotificationCenter - попытаться понять смысл использования делегирования:

NotificationCenter представляет собой отношение один ко многим; Проще говоря, это работает как: отправка (уведомление) уведомления о конкретном событии и наблюдение (получение уведомления) за этим уведомлением - его можно наблюдать где угодно < / em> else; По логике, это то, что означают отношения «один ко многим». Это представление шаблона наблюдателя.


Как подать заявку на делегирование?

Для упрощения я бы назвал это шагами:

  1. Знание требований: каждый делегат имеет свои собственные правила, перечисленные в протоколе делегата, который представляет собой набор сигнатур методов, которые вы должны реализовать для соответствия эта делегация.

  2. Соответствие для делегирования: это просто позволяет вашему классу быть делегатом, отмечая его. Например: class ViewController: UIViewController, UITableViewDelegate {}.

  3. Подключение объекта-делегата: пометить ваш класс как делегата недостаточно, вам нужно убедиться, что объект, который вы хотите, чтобы ваш класс подтвердил, предоставил требуемые работа для вашего класса.

  4. Реализация требований: наконец, ваш класс должен реализовать все необходимые методы, перечисленные в протоколе делегата.


Например

Звучит немного запутанно? А как насчет реального примера?

Рассмотрим следующий сценарий:

Представьте, что вы создаете приложение, связанное с воспроизведением аудио. Некоторые из 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
comment
У меня не сработало, потому что мне нужно было где-то установить делегата. Просто добавьте audioPlayerInstance.delegate = self в viewDidLoad viewController или что-то подобное, и все будет хорошо. - person Bruno Muniz; 22.06.2017
comment
@BrunoMuniz Благодарю за упоминание об этом, я исправил это и добавил новый раздел: Как применить делегирование, чтобы сделать его более понятным. Фрагменты кода, отмеченные # комментариями, показывают шаги добавленного раздела. Надеюсь, это сделает его лучше :) - person Ahmad F; 23.06.2017
comment
Могу я попросить перевести этот ответ для членов моей группы? Я думаю, что эта статья и пример идеально подходят для понимания того, что такое шаблон делегирования - person PrepareFor; 26.09.2017
comment
@DongkunLee Конечно! было бы здорово, если бы этот ответ помог вам, ребята. - person Ahmad F; 26.09.2017
comment
возможно лучший пример, который я видел очень полезным - person Marin; 07.11.2018

Делегирование используется, когда вы хотите передать некоторую информацию или состояние объекта A другому объекту B. Обычно объект B - это объект, создавший объект A.

Я перечислю некоторые ситуации, в которых вы могли бы использовать делегирование.

  1. Да, ты прав. представления таблиц и представления прокрутки используют делегатов, потому что они хотят сообщить всем, кто заинтересован (обычно ваш контроллер представления), что «кто-то выбрал строку!» или «кто-то прокрутил прокрутку!». Не только представления прокрутки и представления таблиц используют делегатов, UITextField и UIDatePicker, а также многие другие представления также используют делегаты!

  2. У контроллеров представления также есть делегаты. Например, UIImagePickerController. Причина примерно та же, что и выше - потому что UIImagePickerController хочет сообщить вам сообщения типа «изображение было выбрано!». Другой пример - UIPopoverControllerDelegate. Этот делегат сообщает вам такие вещи, как «всплывающее окно было закрыто!»

  3. Другие классы, использующие делегаты, включают CLLocationManager. Этот делегат сообщает вам такие вещи, как «местоположение пользователя было обнаружено» или «не удалось определить местоположение пользователя».

  4. Вы можете использовать делегирование в своем коде, когда определенный ваш контроллер представления хочет отправлять сообщения другим контроллерам представления. Если это контроллер представления настроек, он может отправлять сообщения типа «размер шрифта изменен!» и контроллер представления, который заботится об изменении настройки размера шрифта, будет знать и изменять размер шрифта метки или чего-то еще.

person Sweeper    schedule 09.11.2016

Делегировать метод изображениям выбора

Создайте baseClass и вставьте следующий код

введите здесь описание изображения

Создайте другой класс, затем вставьте код

введите здесь описание изображения

введите здесь описание изображения

person Tony Franzis    schedule 24.11.2017
comment
Опубликуйте код, а не изображение кода: meta.stackoverflow.com/questions/285551/ - person Nic3500; 24.11.2017

Делегирование в мире IOS и в основном в MVC (Model View Controller) - это способ взаимодействия View с контроллером, и это называется «слепая коммуникация», а делегирование означает передачу «ведущей ручки» другому объекту (на самом деле все равно кто берет на себя, но обычно Контроллер) для управления компонентами, которые представление не может контролировать самостоятельно (помните, что это только представление) или не владеет, чтобы сделать его более простым ....
контроллер может разговаривать к представлению, но представление не может разговаривать с контроллером без делегирования

person Harvester Haidar    schedule 18.08.2017