Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Прежде всего, вы должны знать, что "Шаблон делегирования" не является исключением для 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!!")
    }
}


Быстрый совет:

Как один из самых популярных примеров использования делегирования - Передача данных назад между диспетчерами просмотра.

Ответ 2

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

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

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

  • Контроллеры просмотра также имеют делегаты. Например, UIImagePickerController. Причина примерно такая же, как и выше, потому что UIImagePickerController хочет сказать вам такие сообщения, как "было выбрано изображение!". Другим примером может быть UIPopoverControllerDelegate. Этот делегат рассказывает вам такие вещи, как "popover был уволен!"

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

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

Ответ 3

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

Ответ 4

Способ делегирования методам выделения

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

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

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

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

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