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

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

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

4 ответов


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

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

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

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


варианты:

делегирование не единственный способ позволить объектам разговаривать друг с другом в iOS, вы можете знать, что там являются:

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


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

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

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

NotificationCenter представляет один-ко-многим отношения; просто, он работает как: проводки (уведомление) сообщение о конкретном событии и observing (получить уведомление о) это уведомление -- это можно наблюдать в любом месте иначе; логически, это то, что означает одно для многих отношений. Это представление Шаблон Observer.


как применить делегирование?

для упрощения я бы упомянул об этом как о шагах:

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

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

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

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


это звучит немного запутанным? Как насчет реального примера?

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

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

до сих пор так хорошо, вид аудиоплеера имеет свой отдельный UIView класс а .xib file; он должен быть добавлен в качестве подвида в любой желаемый viewController.

теперь, как вы можете добавить функциональность к обеим кнопкам для каждого viewController? Вы можете подумать: "просто, я добавлю IBAction в классе view, и это все", на первый взгляд, это может звучать нормально, но после переосмысления немного, вы поймете, что это не будет применимо, если вы пытаетесь обработать событие нажатия кнопки на уровне контроллера; чтобы было ясно, что, если каждый viewController реализовал различные функциональные возможности при нажатии на кнопки в виде аудиоплеера? Например: нажатие плейлиста в "A" viewController отобразит tableView, но нажатие на него в " B " viewController отобразит выбор.

Ну, давайте применять делегация в этом выпуске:

комментарии " # "представляют шаги "как применить делегирование?" раздел.

Аудио Плеер Вид:

// # 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.

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

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

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

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

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


делегировать метод Selectionimages

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

enter image description here

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

enter image description here

enter image description here


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