O que se entende por .delegate = self?

Alguém poderia explicar o significado de someViewController.delegate = self e self.delegate ? Onde eles nos ajudam?

Os delegates enviam mensagens para você.

Por exemplo: se você usar o delegado do acelerômetro, receberá mensagens sobre o acelerômetro.

Se você usar esse novo delegado de detecção de neutrinos, receberá mensagens sobre quaisquer neutrinos detectados na área.

Se você usar PopUps, PopUps enviará mensagens para você. E o jeito que é feito, é com o delegado do PopUp. Existem muitos, muitos exemplos.

Então, os delegates enviam mensagens.

É simples assim.

Você pode perguntar: “ONDE envia essas mensagens?”

A resposta é esta: ele envia as mensagens para onde você definiu o item “.delegate”.

Quando você “define o delegado”, o que você está fazendo é dizer para onde deseja que as mensagens sejam enviadas.

Conseqüentemente,

blah.delegate = amazingPlace enviará as mensagens para “amazingPlace”.

blah.delegate = somewhereElse enviará as mensagens para “somewhereElse”.

blah.delegate = self irá enviar as mensagens …… para você .

Muitas vezes, você quer que as mensagens cheguem a “você”, então basta dizer “blah.delegate = self”

É um erro muito comum, esquecer essa linha de código.

Se você esquecer essa linha de código, você está recheado. As mensagens não chegam a lugar nenhum e você fica coçando a cabeça tentando descobrir o que deu errado.

Outra coisa que você precisa fazer: quando você usa um delegado, precisa dizer que deseja usar o delegado. Nos velhos tempos com objective-c, você faz isso …

 @interface AppDelegate_Pad : NSObject  @interface BigTop : UIViewController  @interface Flying : UIViewController  

Você pode ver que ‘BigTop’ quer usar dois delegates, ou seja, o ASIHTTPRequestDelegate e o UIPopoverControllerDelegate. Considerando que ‘Flying’ só quer usar um delegado – ele quer usar o acelerômetro.

No Swift , não poderia ser mais fácil – você só tem uma vírgula e os protocolos:

  class YourClass:UIViewController, SomeDelegate, AnotherDelegate 

Você não pode realmente fazer muito no iPhone sem usar delegates em todo o lugar.

Delegados são usados ​​em todos os lugares e sempre no iOS.

É perfeitamente normal que uma turma use uma dúzia de delegates.

No exemplo de “Flying” acima, em algum lugar no código para “Flying”, ele teria que dizer [[UIAccelerometer sharedAccelerometer] setDelegate:self];

No caso do BigTop, ele teria que definir o delegado em algum lugar para os ASIHttpRequests,

 ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; [request setPostValue:gid forKey:@"gid"]; [request setPostValue:nom forKey:@"nom"]; [request setDelegate:self]; 

(Não se esqueça nos velhos tempos com x.delegate=self -c, x.delegate=self era exatamente o mesmo que [x setDelegate:self] .)

Hoje em dia com o Swift você simplesmente digita

  x.delegate = self 

e isso é tudo que existe para isso.

Então é isso que você está fazendo. Delegados enviam mensagens . Você tem que dizer para onde quer que as mensagens sejam enviadas. Muito tipicamente, você quer que eles vão para “você”, então nesse caso você simplesmente diz x.delegate=self .

Espero que ajude.

Delegate é usado para passar / comunicar dados / mensagem b / w dois objects de classs. Aqui, tableView (Sender) envia dados / mensagem para viewController (Receiver). Considere o exemplo de implementação do UITableView no viewController personalizado. Aqui, o UITableViewDataSource e o UITableViewDelegate são, na verdade, protocolos. Infelizmente, o UIKit Framework não é de código aberto. Mas vou garantir isso o que acontece internamente depois de referir muitos artigos.

Protocolo é como treinador de basquete com alguns requisitos nele. Ele / ela diz aos jogadores como class, struct, enum what to do? usando esses requisitos. Mas ele / ela doesn't knows how to do? por si mesmo. Assim, a class ou estrutura que conforma esse protocolo deve fornecer implementação para esses requisitos enquanto consegue enterrar a bola.

 protocol UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) } 

Um protocolo é dito ser o protocolo DataSource, em seguida, ele sempre contém funções necessárias com “tipo de retorno”, conforme mostrado abaixo.

 protocol UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell } 

Implementando o UITableView dentro do viewController customizado

 class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource { let tableView = UITableView() override func viewDidLoad { tableView.delegate = self tableView.dataSource = self } 

Aqui, tableView atua como Delegator (remetente) e viewController object ie (self) como Delegate (receptor).

A fim de obter UITableView no viewController . viewController deve estar em conformidade com ambos os protocolos.

Portanto, o object de class viewController implementou todas as funções necessárias de ambos os protocolos. Agora self pode ser usado como tipo UITableViewDelegate ou tipo UITableViewDataSource porque o protocolo pode ser usado como tipo para um object de class que esteja de acordo com ele. Agora, ambas as propriedades de tableView isto é, delegate & dataSource são atribuídas a self mesmas porque possuem os mesmos tipos de protocolos.

As funções não opcionais de ambos os protocolos são implementadas no object de class viewController conforme abaixo

Funções UITableViewDelegate protocolo

 func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { // Do further processes like pushing or poping another viewController } 

Funções do protocolo UITableViewDataSource

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 } func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { return UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell") } 

1) Quando o usuário seleciona uma linha em uma seção, então tableview (Sender) ie UItableView() chama a function UITableViewDelegate abaixo mostrada passando os dados para os parâmetros tableView & indexPath que residem no object viewController (Receiver) através de sua propriedade delegate . Agora o viewController usa esses dados passados ​​para fazer outros processos, como empurrar ou popar para o novo viewController customizado.

 tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

2) Funções dentro do protocolo UITableViewDatasource fornecem dados personalizados para tableview de tableview (Sender). A tableview pede ao object viewController chamando as funções Datasource com a passagem de dados para os parâmetros tableView & indexPath que residem no object viewController (Receiver) através de sua propriedade datasource . Agora, o viewController usa esses dados passados ​​e retorna a tableview dados personalizada. Agora tableview usa esses dados para criar “10” células em uma seção e tipo de “célula” no caminho do índice

 tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10" tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell" 

Por fim, todo o UIKit Framework usa padrões de design delegate & datasource em todas as suas classs, como UIApplication , UITableView , UICollectionView , UITextField e assim por diante, para comunicar dados. Infelizmente, o UIKit Framework não é de código aberto.

Se, em qualquer caso, a resposta de Bourne não ajuda … um delegado é basicamente a reação de um evento em um object e dizer “.delegate = self” significa que esses protocolos foram adotados em self … por exemplo … o que acontece quando uma linha é selecionada em tabLeview é contada pelo método delegado de tableview “didSelectRowAtIndexPath” … e se um viewcontroller tiver uma visualização de tabela .. e “didSelectRowAtIndexPath” for definido nesse viewcontroller somente então diremos … tableview.delegate = self ” … e “self.anything” é usado para dizer que “qualquer coisa” é uma propriedade de si mesmo .. por exemplo. NSString * qualquer coisa; @property (nonatomic, reter) NSString * qualquer coisa;

então “self.anything”