Como criar o seu próprio protocolo com delegado

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
# Importar "ClasseB.h"

NSObject <ClasseBDelegate> { @ Interface ClassA: NSObject {<ClasseBDelegate>
...
}

void ) mioEvento : ( id ) sender; - (Void) mioEvento: (id) sender;

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

11 comentários para "Como criar o seu próprio protocolo com proxy"

  1. 06 de janeiro de 2011 Louis:

    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.

  2. 09 de janeiro de 2011 Giovambattista Fazioli :

    @ 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:

    1
    2
    3
    self.delegate != NULL && [ self.delegate respondsToSelector : @selector ( mioEvento : ) ] ) { if (self.delegate = NULL && [respondsToSelector self.delegate: @ selector (mioEvento :)]) {
    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.

  3. 09 de janeiro de 2011 Louis:

    Obrigado ...
    Eu tenho outra pergunta ... decorre do fato de que eu não brincava com o código e talvez atirar nonsense : D

    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

  4. 09 de janeiro de 2011 Giovambattista Fazioli :

    @ 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:

    1
    2
    3
    UIViewController <myClassADelegate> { @ Interface myViewController: UIViewController {<myClassADelegate>
    * MyClassA Objecta;
    }

    e, come detto sopra, se funzngerà anche da delegato per la myClassA nell'implementazione del metodo avrà accesso alla variabile objectA : myViewController instanzierà o objecto do tipo myClassA e, como mencionado acima, se funzngerà também ser transferidos para a myClassA na execução do método terá acesso à variável objectA :

    1
    2
    3
    4
    void ) mioEvento { - (Void) {mioEvento
    / / Faz alguma coisa
    ; [Objecta myMethod];
    }

    Em laternativa há casos em que o delegado é um objeto de outra classe, como:

    1
    2
    3
    4
    5
    6
    / / Estamos em um controlador de vista
    ...
    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 myClassA apontando para este como um delegado myClassB . che, ovviamente, non conosce a priopri il puntatore alla myClassA . O evento gerado por myClassA será gerido pela myClassB que obviamente não sabe o ponteiro para priopri myClassA .
    qualcuno deve passargliela; questo qualcuno è il view controller che conosce entrambe. Neste caso, se a instância do myClassB deve interagir com a instância do myClassA alguém tem que passá-lo, este é alguém que sabe tanto o controlador vista. Assim, o código acima deve ser:

    1
    2
    3
    4
    5
    6
    7
    / / Estamos em um controlador de vista
    ...
    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 ...

  5. 10 de janeiro de 2011 Louis:

    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!

  6. 10 março de 2011 Objective-C: Notificações e Delegados | Undolog.com :

    [...] 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 [...]

  7. 02 de fevereiro de 2012 Mark:

    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

    1
    2
    3
    4
    5
    6
    void ) startTimer { - (Void) {startTimer
    / / Blá, blá, blá NSTimer
    }
    void ) stopTimer { - (Void) {stopTimer
    / / Timer invalidado blá blá blá
    }

    Eu fiz o seguinte:
    em OptionViewController.h eu criei

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @ OptionViewControllerDelegate Protocolo
    @ 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.m I:

    1
    2
    3
    4
    5
    6
    7
    8
    void ) metodoGestoreTimer - (Void) metodoGestoreTimer
    {
    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:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    / ** PrimaClasse.h ** /

    # 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! : D

  8. 02 de fevereiro de 2012 Mark:

    esquecido .. del delegato l'ho messo em OptionViewController a @syntetize eu coloquei o delegado : D

  9. 02 de fevereiro de 2012 Mark:

    Desculpe o spam .. Notei que há um erro ..
    aqui é a correcção

    1
    2
    3
    4
    / ** PrimaClasse.h ** /
    # Importar "OptionViewController.h"

    NSObject @ Interface PrimaClasse: NSObject
  10. 02 de fevereiro de 2012 Giovambattista Fazioli :

    @ 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 ...

  11. 02 de fevereiro de 2012 Mark:

    Muito obrigado, eu tenho aceso : D
    Eu resolvi, definindo

    1
    2
    3
    4
    5
    6
    7
    / / OptionViewController.m
    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!

Deixe um comentário

TAG XHTML LICENÇAS: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> CÓDIGO DE INSERÇÃO:
 <pre></pre> // blocco generico <code></code> // blocco generico [cc_actionscript][/cc_actionscript] // Actionscript [cc_actionscript3][/cc_actionscript3] // Actionscript 3 [cc_css][/cc_css] // CSS Style Sheet [cc_html][/cc_html] // HTML [cc_js][/cc_js] // Javascript [cc_objc][/cc_objc] // Objective-C [cc_php][/cc_objc] // PHP [cc_sql][/cc_sql] // SQL 


Pare SOPA