O que exatamente o delegado faz no projeto xcode ios?

Eu tenho apenas aprendido o desenvolvimento de aplicativos para iPhone, mas eu tenho dificuldade em entender o que o delegado realmente significa? Alguém pode me dizer com o exemplo o que faz e como é importante? Obrigado por qualquer ajuda!

É um conceito-chave para entender conceitualmente, então é importante saber como pensar sobre isso antes dos detalhes técnicos. Simplificando, um delegado é um retorno de chamada.

Dois cenários principais para usar delegates:

  1. Uma class ou controle quer abstrair os detalhes sobre como fazer o trabalho (como recuperar dados).
  2. Permitir que outras pessoas anexe código a um pipeline.

Exemplos: UITableView – uma visualização de tabela é apenas um controle que sabe como renderizar uma lista de células. Ele lida com todo o trabalho pesado de renderização, rolagem, etc … Mas, não tem idéia de como carregar seus dados. Então você implementa um delegado de datasource que tem methods para obter os dados da célula para uma determinada linha, etc … Isso torna tudo mais fácil para você. Você apenas usa o controle e conecta os detalhes para seus dados. O UITableView fará tudo por você … apenas responda algumas perguntas específicas para. Um delegado responde a essas poucas perguntas específicas.

Um controle de texto – você adiciona um controle de texto à sua visualização e voila! você pode digitar e tudo bem. Mas e se você quiser fazer algo quando eles começarem a digitar ou quando eles terminarem de digitar? Bem, o controle de texto oferece um delegado com methods que permitem conectar-se ao pipeline de execução do controle de texto. Ele permite que o controle de texto faça tudo por você e permite que você intercepte o código onde for necessário. Muitas vezes, há uma maneira de inserir código para decidir se algo é permitido. O controle ligará de volta e perguntará se eu posso fazer x? Você pode inserir código e influenciar o comportamento.

Se você está criando um controle ou class, você pode criar seu próprio protocolo, delegates da fonte de dados, etc … para que seu controle possa se concentrar em fazer o que é anunciado. Por exemplo, digamos que você queira criar um controle de tarefas. Você poderia:

Primeiro, crie um contrato. Ei, se você for fornecer dados para o meu controle, essas são as perguntas que vou fazer a você. Eu vou levá-lo a partir daí … Neste caso, vou perguntar-lhe o número de tarefas e eu vou ter você me dar uma tarefa, dado o número da linha.

@protocol XXTaskBoardDelegate  -(NSInteger*)getTaskCount; -(XXTask*)getTaskForRow:(NSInteger*)rowNumber; @end 

No controle ou class, forneça ao consumidor uma maneira de nos fornecer a class de datasource delegada que responderá às perguntas que o controle fará. Neste ponto, o controle é um controle puro. Não sabe nada sobre como você obtém seus dados. Está pedindo um object (id) que implemente um contrato / protocolo. identidade

 @implementation XXTaskBoard - (void)setDelegate:(id)newDelegate { // the control stores the delegate so it can callback and ask you questions. } 

Então, para a class delegada, no header declare que você implementa esse protocolo formal e no arquivo m de implementação você fornece o código.

 @interface AppController : NSObject { //... } 

em seguida, implementá-lo na implementação

 @implementation AppController - (NSInteger*)getTaskCount { return [model queryTaskCount]; } - (XXTask*)getTaskForRow:(NSInteger*)rowNumber { return [[model tasks] getItem:(NSInteger*)rowNumber]; } 

Um delegado é um object para o qual outra class pode passar mensagens. Na prática, as classs delegadas precisam estar em conformidade com um protocolo delegado.

Por exemplo, vamos pegar uma subclass de um controlador de visão de tabela. Este é um delegado para sua exibição de tabela. Primeiro você define que é um delegado de exibição de tabela, fazendo isso:

 MyTableViewController : UITableViewController  

Isso diz que a class MyTableViewController é uma subclass de UITableViewController e CONFORMS para o protocolo UITableViewDelegate .

Definir [tableView setDelegate:self] (ou defini-lo como tal no IB) passa o object self para a tableview para que a tableview possa enviar mensagens para ele.

A mensagem principal que envia é a mensagem didSelectRowAtIndexPath que diz à sua class que o usuário pressionou uma célula de visualização de tabela.

Portanto, o object que recebe o evento click (a exibição de tabela) transmite a mensagem de que a célula foi clicada no object delegado (que, nesse caso, é o object MyTableViewController ).

Delegado protocolos existem para que você possa certificar-se de que o object delegado tem os methods necessários para lidar com suas mensagens. Os methods em um protocolo delegado podem ser @optional ou aplicados. Quaisquer methods opcionais não precisam ser definidos. Na sua class MyTableViewController o método didSelectRowAtIndexPath é opcional – você não precisa tê-lo. Se a exibição de tabela não encontrar o método, ela não será chamada.

No entanto, o cellForRowAtIndexPath é necessário e sem ele seu aplicativo não será compilado.

Espero que isso ajude e seja simples para você. Se precisares de mais informação avisa-me.

Os delegates são apenas uma maneira de obter retornos de chamadas de algo. Você passa um delegado (um ponteiro para um object em conformidade com um protocolo) para algo e quando ele tem novos dados para você ou quando ocorre um evento que algo faz uma chamada de método no delegado.

Por exemplo, quando os events ocorrem, como se seu aplicativo fosse colocado em segundo plano ou o aplicativo estivesse prestes a terminar, o object UIApplication chamaria seu delegado de aplicativo para informá-lo. Quando um CLLocationManager tiver uma nova posição GPS, chamará seu delegado para passar a nova posição. UITableViews chamam seus representantes para obter UITableViewCells para exibir na tabela. Existem muitos usos de delegates no iOS.