delegate delegado swift design-patterns delegates protocols delegation

delegate - delegado swift



Ejemplos de delegados en Swift (4)

¿Qué es la delegación?

En primer lugar, debe saber que el Patrón de delegación no es exclusivo para el mundo de iOS:

En ingeniería de software, el patrón de delegación es un patrón de diseño en programación orientada a objetos que permite que la composición de objetos logre la misma reutilización de código que la herencia.

Pero trabajar con la delegación en el mundo de iOS es tan común, supongo que puede ver muchas de las clases que proporcionan una fuente de delegación / datos para proporcionar la capacidad de proporcionar propiedades o comportamientos para la instancia utilizada. Es uno de los principales mecanismos de cómo los objetos se comunican entre sí en CocoaTouch.

Alternativas:

Sin embargo, la delegación no es la única forma de permitir que los objetos se comuniquen entre sí en iOS, es posible que desee saber que hay:

Observación : en caso de que esté interesado en compararlos, puede consultar los siguientes artículos:

¿Cuándo usar Delegación?

Entonces, la pregunta es: "Entonces, ¿por qué debería usar la delegación en lugar de esas opciones?"

Trataré de hacerlo simple; Sugeriría el uso de delegación cuando tienes una relación uno a uno entre dos objetos. Solo para aclararlo, el objetivo de hablar un poco sobre NotificationCenter es tratar de tener sentido cuando se utilizan delegaciones:

NotificationCenter representa una relación de uno a muchos ; Simplemente, funciona como: publicar (notificar) una notificación sobre un evento específico y observar (recibir notificación sobre) esta notificación; podría observarse en cualquier otro lugar ; Lógicamente, eso es lo que significa relación uno a muchos. Es una representación del patrón observador .

¿Cómo aplicar la delegación?

Para simplificar, lo mencionaría como pasos:

  1. Conocer los requisitos: cada delegado tiene sus propias reglas , enumeradas en el protocolo de delegado, que es un conjunto de firmas de métodos que debe implementar para conformar esta delegación.

  2. Conforme a la delegación: simplemente está permitiendo que su clase sea un delegado, marcándola. Por ejemplo: class ViewController: UIViewController, UITableViewDelegate {} .

  3. Conexión del objeto delegado: Marcar su clase como delegado no es suficiente, debe asegurarse de que el objeto que desea que sea confirmado por su clase para dar el trabajo requerido a su clase.

  4. Implementación de los requisitos: Finalmente, su clase debe implementar todos los métodos requeridos enumerados en el protocolo delegado.

Por ejemplo

¿Suena un poco confuso? ¿Qué pasa con un ejemplo del mundo real?

Considere el siguiente escenario:

Imagine que está creando una aplicación relacionada con la reproducción de audios. Algunos de los viewControllers deberían tener una vista de un reproductor de audio . En el caso más simple, suponemos que debe tener un botón de reproducción / pausa y otro botón para, digamos, mostrar una lista de reproducción de alguna manera, independientemente de cómo se vea.

Hasta ahora todo bien, la vista del reproductor de audio tiene su clase UIView separada y el archivo .xib ; debe agregarse como una subvista en cualquier viewController deseado.

Ahora, ¿cómo puede agregar funcionalidad a ambos botones para cada viewController? Puede pensar: "Simplemente, IBAction una IBAction en la clase de vista y IBAction ", a primera vista, puede sonar bien, pero después de pensarlo un poco, se dará cuenta de que no será aplicable si usted están tratando de manejar el evento de tocar el botón en la capa del controlador; Para que quede claro, ¿qué pasa si cada viewController implementa una funcionalidad diferente al tocar los botones en la vista del reproductor de audio? Por ejemplo: al tocar la lista de reproducción en "A" viewController se mostrará una tableView, pero al tocarla en la "B" viewController se mostrará un selector.

Bueno, apliquemos Delegación a este problema:

Los comentarios "#" representan los pasos de "¿Cómo aplicar la delegación?" sección.

Vista del reproductor de audio:

// # 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() } }

Controlador de vista:

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!!") } }


Consejo rapido:

Como uno de los ejemplos más populares del uso de la delegación es Pasar datos de vuelta entre los Controladores de vista.

He estado tratando de aprender cómo funciona la delegación con protocolos. Entendí todo, pero no puedo pensar cuándo usar la delegación que no sea cuando se usan vistas de tabla y posiblemente vistas de desplazamiento.

En general, ¿cuándo se usa la delegación?


La delegación en el mundo IOS y principalmente en MVC (Model View Controller) es una forma de que la View hable con el Controller y se llama "comunicación ciega" y delegación significa darle el "palo principal" a otro objeto (realmente no le importa quién se hace cargo, pero generalmente el Controlador) para controlar los componentes que la vista no puede controlar por sí misma (recuerde que es solo una vista) o que no posee para hacerlo más simple ...
el controlador puede hablar con una vista pero la vista no puede hablar con el controlador sin Delegación


La delegación se utiliza cuando desea pasar alguna información o estado del objeto A a otro objeto B. Por lo general, el objeto B es el objeto que creó el objeto A.

Enumeraré algunas situaciones en las que usarías delegación.

  1. Sí tienes razón. las vistas de tabla y las vistas de desplazamiento usan delegados porque quieren decirle a quien esté interesado (generalmente su controlador de vista) que "alguien seleccionó una fila". o "alguien desplazó la vista de desplazamiento". ¡Las vistas de desplazamiento y las vistas de tabla no solo usan delegados, UITextField y UIDatePicker y muchas otras vistas también usan delegados!

  2. Los controladores de vista también tienen delegados. Por ejemplo, UIImagePickerController . La razón es más o menos la misma que la anterior, porque el UIImagePickerController quiere decirte mensajes como "¡se ha seleccionado una imagen!". Otro ejemplo sería UIPopoverControllerDelegate . Este delegado te dice cosas como "¡se ha descartado el popover!"

  3. Otras clases que usan delegados incluyen CLLocationManager . Este delegado le dice cosas como "se detectó la ubicación del usuario" o "no se pudo detectar la ubicación del usuario".

  4. Puede usar la delegación en su código cuando un determinado controlador de vista quiere enviar mensajes a otros controladores de vista. Si se trata de un controlador de vista de configuración, puede enviar mensajes como "¡se ha cambiado la configuración del tamaño de fuente!" y el controlador de vista que se preocupa por el cambio en la configuración del tamaño de fuente sabrá y cambiará el tamaño de fuente de una etiqueta o algo así.


Método delegado a las imágenes de selección

Cree baseClass e inserte el siguiente código

Crear otra clase y luego insertar código