Mesmo no tutorial mais simples que você pode encontrar o uso de protocolos. Ele com certeza vai acontecer a muitos de seu controlador vista usados em um protocolo, introduzindo, ao lado da definição da interface, uma declaração semelhante a:
1 2 3 | UIViewController <UIWebViewDelegate> { @ Interface myViewController: UIViewController {<UIWebViewDelegate> ... } |
Os protocolos (no exemplo acima <UIWebViewDelegate> ) são uma forma particular de Objectivo C-herdar o comportamento de uma classe para outra. No exemplo mostrado acima do nosso controlador de exibição gerencia um componente provavelmente UIWebView . Ao responder os eventos do último havia incorporado o protocolo UIWebViewDelegate .
, come ad esempio: Assim, o protocolo implementado UIWebViewDelegate no nosso controlador de vista, podemos inserir no arquivo de implementação m dos métodos (mensagens) que será invocada pelo componente. UIWebView , tais como:
1 2 3 | void ) webViewDidFinishLoad : ( UIWebView * ) webView { - WebViewDidFinishLoad (Void): (UIWebView *) {WebView / / Carrega página completa } |
Em outras palavras, nossas ações de exibição de controlador da interface <UIWebViewDelegate> , ou seja, ele herda "algumas" Deluxe braços.
Escreva nosso protocolo
. Imagine que temos duas classes: ClasseA e ClasseB . che, a sua volta, genera un messaggio quando accade un determinato evento. A classe ClasseA instancia dentro do ClasseB que, por sua vez, gera uma mensagem quando ocorre um determinado acontecimento. per rispondere e intercettare gli “eventi” rilasciati da ClasseB . Nós, então, escrever um delegado para ClasseB que pode ser usado por ClasseA para responder e interceptar os "eventos" de emissão da ClasseB .
: A primeira coisa a fazer é adicionar a definição do protocolo em ClasseB juntamente com uma propriedade (no padrão da Apple) delegate :
1 2 3 4 5 6 7 8 9 10 11 | @ Protocolo ClasseBDelegate <NSObject> @ Opcional void ) mioEvento : ( id ) sender; - (Void) mioEvento: (id) sender; @ End NSObject { @ Interface ClasseB: NSObject { / / Outras definições <ClasseBDelegate> ID delegado; } assign ) id <ClasseBDelegate> delegate; @ Property (atribuir) delegado ID <ClasseBDelegate>; |
Como de costume, no arquivo de M. ClasseB Carrinho de Compras:
1 | @ Sintetizar delegado; |
No arquivo de implementação da classe ClasseB podemos colocar o "fogo" do nosso evento desta forma:
1 2 3 | self.delegate != NULL && [ self.delegate respondsToSelector : @selector ( mioEvento : ) ] ) { if (self.delegate = NULL && [respondsToSelector self.delegate: @ selector (mioEvento :)]) { self ] ; [MioEvento delegado: auto]; } |
: [self.delegate respondsToSelector:@selector(mioEvento:)] . Primeiro verifique se você definiu um delegado: self.delegate != NULL e que este delegado fornece, ou seja susceptível de responder à mensagem mioEvento : [self.delegate respondsToSelector:@selector(mioEvento:)] . ) che è il puntatore all'istanza della classe ClassB . Se ambas as condições são verificadas em seguida, chamar mioEvento , neste exemplo, este evento também inclui um parâmetro ( id ), que é o ponteiro para a instância da classe ClassB .
: A classe ClassA não terá que fazer é implementar o método de delegado e entrar mioEvento :
1 2 3 4 5 6 7 |
No arquivo de implementação quando criamos ClassB usando:
1 2 | [ ClasseB alloc ] ; ClasseB classeB * = [ClasseB alloc]; self ] ; [SetDelegate ClasseB: auto]; |
Em seguida, insira:
1 2 3 | void ) mioEvento : ( id ) sender { - (Void) mioEvento: (id) sender { "mioEvento" ) ; NSLog (@ "mioEvento"); } |










Olá,
Artigo elogios!
Eu queria esclarecer minhas dúvidas sobre o uso ...
O delegado geralmente é chamado quando um evento acontece ... neste caso, depois que criamos o "delegado" o método "mioEvento" deve ser executado por mão?
Eu não entendi essa etapa
Obrigado.
@ Luís: Sim, a classe que suporta o protocolo que nós criamos também procurará invocar o método delegado. Como mostrado acima, em nosso evento all'accadere classe irá executar o código como:
2
3
self ] ; [MioEvento delegado: auto];
}
Ou, se você tiver definido um delegado e que o apoio delegado o método solicitado, então o método é executado.
Nas aulas princípio pesonali, de complexidade média, deveria - este é o caso - supportatre um protocolo para informá-los de eventos e estados de mesma classe.
Se outras questões escrever bem.
Obrigado ...
Eu tenho outra pergunta ... decorre do fato de que eu não brincava com o código e talvez atirar nonsense
Eu crio o meu protocolo, e vamos supor que eu me lembro de que all'accadere evento um determinado método do protocolo que você tenha dirigido.
A implementação do método vai fazer no curso. M do meu protocolo
Se eu chamar um método que faz parte da minha classe delegante (ou seja, aquele que usa o delegado), como proceder?
Eu tenho a minha ideia, mas eu não vou escrever bagianate
@ Luís: Se eu entendi sua pergunta, que normalmente são confrontados com dois casos. Normalmente você tem um controlador de vista que, além de instanciar o objeto que suporta um determinado protocolo é também um delegado. Neste caso, ao escrever a implementação do método é tem acesso directo para a instância do objeto que fornece o protocolo. Isto pode ser esquematizada como se segue:
2
3
* MyClassA Objecta;
}
e, come detto sopra, se funzngerà anche da delegato per la
myClassAnell'implementazione del metodo avrà accesso alla variabileobjectA:myViewControllerinstanzierà o objecto do tipomyClassAe, como mencionado acima, se funzngerà também ser transferidos para amyClassAna execução do método terá acesso à variávelobjectA:2
3
4
/ / Faz alguma coisa
; [Objecta myMethod];
}
Em laternativa há casos em que o delegado é um objeto de outra classe, como:
2
3
4
5
6
...
myClassA alloc ] init ] ; Objecta = [[myClassA alloc] init];
[ [ myClassB alloc ] init ] ; myClassB objectB * = [[myClassB alloc] init];
objectA.delegate = objectB;
...
. Neste caso, um controlador de vista instancia a classe
myClassAapontando para este como um delegadomyClassB. che, ovviamente, non conosce a priopri il puntatore allamyClassA. O evento gerado pormyClassAserá gerido pelamyClassBque obviamente não sabe o ponteiro para prioprimyClassA.qualcuno deve passargliela; questo qualcuno è il view controller che conosce entrambe. Neste caso, se a instância do
myClassBdeve interagir com a instância domyClassAalguém tem que passá-lo, este é alguém que sabe tanto o controlador vista. Assim, o código acima deve ser:2
3
4
5
6
7
...
myClassA alloc ] init ] ; Objecta = [[myClassA alloc] init];
[ [ myClassB alloc ] init ] ; myClassB objectB * = [[myClassB alloc] init];
objectA ] ; // informa B di A [ObjectB setObjectAPointer: Objecta] / / informar B de A
objectA.delegate = objectB;
...
Se eu entendi a pergunta ...
No primeiro caso ...
Eu chamo o método myMethod que terá, obviamente, uma implementação.
Bem ... em que a aplicação fazer conta para executar uma acção que fornece uma chamada de um método ou a utilização de uma variável presente na minha myViewController
Como eu faço?
Espero que eu expliquei-me!
[...] Elegante, clara e fácil de usar para lidar com estas situações. Já falamos em criar um protocolo com o seu próprio delegado. Objective-C permite que você defina um protocolo de comunicação através do qual uma ou mais classes [...]
Olá, parabéns de mim para o artigo .. Eu tenho uma preocupação para exportação ..
Estou no caso em que eles estão em um controlador de guia, cada viewController tem uma classe específica
tab1: PrimoController
tab2: OptionController
o que eu quero fazer é parar e que está em um temporizador startare PrimoController dall'OptionController, este startare temporizador e eu também pode parar no primeiro controlador com 2 métodos
2
3
4
5
6
/ / Blá, blá, blá NSTimer
}
void ) stopTimer { - (Void) {stopTimer
/ / Timer invalidado blá blá blá
}
Eu fiz o seguinte:
em
OptionViewController.heu criei2
3
4
5
6
7
8
9
10
@ Obrigatório
void ) timerActionRestart; - (Void) timerActionRestart;
@ End
UITableController @ Interface OptionViewController: UITableController
weak, nonatomic ) id timerHandlerDelegate; @ Property (fraco, não atômica) timerHandlerDelegate id;
@ End
em
OptionViewController.mI:2
3
4
5
6
7
8
{
timerHandlerDelegate != nil ) { if (timerHandlerDelegate! = nil) {
"timerActionRestar" ) ; NSLog (@ "timerActionRestar");
; [Self.timerHandlerDelegate timerActionRestart];
}
}
E assim tudo está certo .. Se em vez disso, na primeira classe, a situação é a seguetne:
2
3
4
5
6
7
8
9
10
11
12
13
# Importar "OptionViewController.h"
NSObject @ Interface OptionViewController: NSObject
/ ** PrimaClasse.m ** /
void ) timerActionRestart - (Void) timerActionRestart
{
/ Timer Stop /
/ Start / timer
) ; NSLog ("timer reiniciar");
}
Eu acho que deve definir o delegado, mas sendo 2 aulas já foram inicializados, não sei como!
Alguma idéia?
Agora sabe que
metodoGestoreTimeré chamado, mas não registra nada, dado que não a verificação da SE ..Obrigado novamente e parabéns pelo blog!
esquecido .. del delegato l'ho messo em
OptionViewControllera@syntetizeeu coloquei o delegadoDesculpe o spam .. Notei que há um erro ..
aqui é a correcção
2
3
4
# Importar "OptionViewController.h"
NSObject @ Interface PrimaClasse: NSObject
@ Mark: Eu sugiro que você acha que uma abordagem mais correta. Se você executar a subclasse do controlador de guia, esta detém uma lista de todos os controladores de vista. A questão deve ser lido nos seguintes termos: a opção View Controller pergunta a outro controlador para executar uma operação (ativar ou desativar um temporizador). A opção controlador de vista é um "filho", como o outro, o controlador de guia. Por conseguinte, é mais apropriado que a mensagem vai desde a opção de controlador para o controlador de vista guia que por sua vez smisterà a mensagem para os responsáveis. O controlador de exibição guia sabe tudo de seu controlador de vista, para que eles possam enviar uma mensagem para ninguém. A visão sabe que seu controlador opções de definição de controlador guia.
Se eu tiver tempo eu vou tentar fazer um exemplo de código, mas eu dei-lhe toda a informação que você precisa também de prosseguir sozinho. Deixe-me saber se eu perdi alguma coisa pelo caminho ...
Muito obrigado, eu tenho aceso
Eu resolvi, definindo
2
3
4
5
6
7
void ) viewDidLoad { - (Void) {viewDidLoad
....
/ Partition / a delegado para o temporizador de reinício
viewControllers = self.tabBarController.viewControllers; NSArray * = viewControllers self.tabBarController.viewControllers;
viewControllers objectAtIndex : 0 ] ; self.timerHandlerDelegate = [objectAtIndex viewControllers: 0];
}
Agora tudo funciona!
muito obrigado!