Exemplos de Delegados no Swift

Eu tenho tentado aprender como a delegação com protocolos funciona. Eu entendi tudo, mas não consigo pensar em quando usar a delegação além de usar exibições de tabela e possivelmente visualizações de rolagem.

Em geral, quando a delegação é usada?

O que é delegação?

Primeiro de tudo, você deve saber que o Padrão de Delegação não é exclusivo para o mundo do iOS:

Na engenharia de software, o padrão de delegação é um padrão de design na programação orientada a objects que permite que a composição de objects atinja o mesmo código de reutilização como inheritance.

Mas trabalhar com a delegação no mundo do iOS é tão comum, suponho que você possa ver muitas das classs que fornecem uma delegação / fonte de dados para fornecer a capacidade de fornecer propriedades ou comportamentos para a instância usada. É um dos principais mecanismos de como os objects se comunicam no CocoaTouch.


Alternativas:

No entanto, a delegação não é a única maneira de permitir que objects conversem entre si no iOS, você pode querer saber que existem:

  • NotificationCenter .
  • KVO (observação de valores-chave) .
  • Manipuladores de conclusão / Callbacks (usando encerramentos) .
  • Ação-alvo .

Observação : no caso, se você estiver interessado em comparar entre eles, você pode querer verificar os seguintes artigos:

  • Padrões de Comunicação.
  • Quando usar a delegação, notificação ou observação no iOS.
  • Delegados vs Observadores.

Quando usar a delegação?

Então, a pergunta é: “Então, por que devo usar delegação em vez dessas opções?”

Vou tentar simplificar; Eu sugeriria o uso de delegação quando você tem um para um relacionamento entre dois objects. Apenas para deixar mais claro, o objective de falar um pouco sobre o NotificationCenter é tentar fazer sentido quando as delegações são usadas:

O NotificationCenter representa um para muitos relacionamentos; Simplesmente, funciona como: postar (notificar) uma notificação sobre um evento específico e observar (ser notificado sobre) essa notificação – ela pode ser observada em qualquer outro lugar ; Logicamente, é isso que significa um para muitos relacionamentos. É uma representação do padrão do observador .


Como aplicar a delegação?

Para simplificar, gostaria de mencionar como etapas:

  1. Conhecendo os requisitos: Cada delegado tem suas próprias regras , listadas no protocolo delegado, que é um conjunto de assinaturas de método que você deve implementar para adequar essa delegação.

  2. Em conformidade com a delegação: é simplesmente permitir que sua turma seja uma delegada, marcando-a. Por exemplo: class ViewController: UIViewController, UITableViewDelegate {} .

  3. Conectando o object delegado: não é suficiente marcar sua class para ser um delegado, você precisa garantir que o object que deseja confirmar pela sua turma dê o trabalho necessário à sua turma.

  4. Implementando os requisitos: Finalmente, sua class deve implementar todos os methods necessários listados no protocolo delegado.


Por exemplo

Soa um pouco confuso? Que tal um exemplo do mundo real?

Considere o seguinte cenário:

Imagine que você esteja criando um aplicativo relacionado a tocar áudios. Alguns dos viewControllers devem ter uma visualização de um player de áudio . No caso mais simples, assumimos que deveria ter um botão play / pause e outro botão para, digamos, mostrar uma lista de reprodução de alguma forma, independentemente de como ela possa parecer.

Até aqui tudo bem, a visualização do reprodutor de áudio tem sua class UIView e arquivo .xib ; ele deve ser adicionado como uma subvisualização em qualquer viewController desejado.

Agora, como você pode adicionar funcionalidade a ambos os botões para cada viewController? Você pode pensar: “Simplesmente, vou adicionar um IBAction na class de visualização e é isso”, à primeira vista, pode parecer ok, mas depois de repensar um pouco, você vai perceber que não será aplicável se você está tentando lidar com o evento de tocar no botão na camada do controlador; Para deixar claro, e se cada viewController implementasse uma funcionalidade diferente ao tocar nos botões na visualização do reprodutor de áudio? Por exemplo: tocar na lista de reprodução em “A” viewController exibirá um tableView, mas tocando-o na view “B” O Controlador mostrará um selecionador.

Bem, vamos aplicar a Delegação a esta questão:

Os comentários “#” representam as etapas de “Como aplicar a delegação?” seção.

Visualização do Audio Player:

 // # 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 visualização:

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

Dica rápida:

Como um dos exemplos mais populares do uso de delegação é Passar dados de volta entre os controladores de exibição.

Delegação é usada quando você quer passar alguma informação ou estado do object A para outro object B. Normalmente, o object B é o object que criou o object A.

Vou listar algumas situações em que você usaria a delegação.

  1. Sim, você está certo. As exibições de tabela e exibições de rolagem usam representantes porque desejam informar a quem estiver interessado (normalmente, seu controlador de exibição) que “alguém selecionou uma linha”. ou “alguém rolou a visualização de rolagem!”. Não apenas as visualizações de rolagem e as visualizações de tabela usam delegates, UITextField e UIDatePicker e muitas outras exibições também usam delegates!

  2. Controladores de exibição também têm delegates. Por exemplo, UIImagePickerController . A razão é aproximadamente a mesma que acima – porque o UIImagePickerController quer lhe dizer mensagens como “uma imagem foi selecionada!”. Outro exemplo seria UIPopoverControllerDelegate . Este delegado diz coisas como “o popover foi dispensado!”

  3. Outras classs que usam delegates incluem CLLocationManager . Este delegado informa coisas como “a localização do usuário foi detectada” ou “não conseguiu detectar a localização do usuário”.

  4. Você pode usar a delegação em seu código quando um determinado controlador de visualização deseja enviar mensagens para outros controladores de visualização. Se for um controlador de exibição de configurações, ele poderá enviar mensagens como “a configuração do tamanho da fonte foi alterada!” e o controlador de visualização que se preocupa com a alteração da configuração do tamanho da fonte saberá e alterará o tamanho da fonte de um label ou algo assim.

Delegate Method to Selectionimages

Criar baseClass e insira o seguinte código

insira a descrição da imagem aqui

Crie outra class e insira o código

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Delegação no mundo IOS e principalmente no MVC (Model View Controller) é uma forma de o View falar com o Controller e é chamado de “comunicação cega” e delegação significa dar o “stick” a outro object (não importa quem está assumindo, mas geralmente o Controller) para controlar os componentes que a visão não pode controlar por conta própria (lembre-se que é apenas uma visão) ou não possui para torná-lo mais simples ….
o controlador pode falar com uma visão, mas a visão não pode falar com o controlador sem Delegação