Cómo crear tu propio protocolo con la delegada

Incluso en el tutorial mas simple que usted puede encontrar el uso de los protocolos. Sin duda, va a pasar con muchos de su controlador de vista utilizado en un protocolo, escribir, junto a la definición de la interfaz, una declaración similar a:

1
2
3
UIViewController <UIWebViewDelegate> { @ MyViewController Interfaz: {UIViewController <UIWebViewDelegate>
...
}


Los protocolos (en el ejemplo anterior <UIWebViewDelegate> ) son una forma particular de Objective-C para heredar el comportamiento de una clase a otra. En el ejemplo mostrado por encima de nuestro controlador de vista gestiona un componente probablemente UIWebView . Al responder a los acontecimientos de estos últimos había incorporado el protocolo UIWebViewDelegate .
, come ad esempio: Por lo tanto, se implementó el protocolo de UIWebViewDelegate en nuestro controlador de vista, podemos insertar en el archivo m de métodos de aplicación (mensajes) que serán invocados por el componente. UIWebView , tales como:

1
2
3
void ) webViewDidFinishLoad : ( UIWebView * ) webView { - (Void) webViewDidFinishLoad: (UIWebView *) {WebView
/ / Carga la página completa
}

En otras palabras, nuestras acciones en el controlador de vista de la interfaz de <UIWebViewDelegate> , es decir, se hereda "algunas" de lujo apoyabrazos.

Escribir el protocolo

. Imaginemos que tenemos dos clases: ClasseA y ClasseB . che, a sua volta, genera un messaggio quando accade un determinato evento. La clase ClasseA instancia a su interior de la ClasseB que, a su vez, genera un mensaje cuando ocurre un evento determinado. per rispondere e intercettare gli “eventi” rilasciati da ClasseB . A continuación, iba a escribir un delegado para ClasseB que puede ser utilizado por ClasseA para responder e interceptar a los "eventos" emitidos por ClasseB .
: La primera cosa a hacer es agregar la definición del protocolo en ClasseB junto con una propiedad (en el estándar de Apple) delegate :

1
2
3
4
5
6
7
8
9
10
11
@ Protocolo ClasseBDelegate <NSObject>
@ Opcional
void ) mioEvento : ( id ) sender; - (Void) mioEvento: (id) del remitente;
@ End

NSObject { @ Interfaz ClasseB: NSObject {
/ / Otras definiciones
<ClasseBDelegate> Identificación del delegado;
}

assign ) id <ClasseBDelegate> delegate; @ Property (asignar) Identificación del delegado <ClasseBDelegate>;

Como de costumbre, en el archivo de la M. ClasseB carrito:

1
@ Sintetizar delegado;

En el archivo de implementación de la clase ClasseB podemos poner el "fuego" de nuestro evento de esta manera:

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:)] . Primer lugar, compruebe que ha configurado un delegado: self.delegate != NULL y que este delegado proporciona, o es probable que responda al mensaje mioEvento : [self.delegate respondsToSelector:@selector(mioEvento:)] . ) che è il puntatore all'istanza della classe ClassB . Si las dos condiciones se verifican invocarla mioEvento , en este ejemplo, este evento también proporciona un parámetro ( id ), que es el puntero a la instancia de la clase ClassB .
: La clase ClassA no tiene que hacer es poner en práctica el método de delegado e ingresar mioEvento :

1
2
3
4
5
6
7
# Importar "ClasseB.h"

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

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

En el archivo de la aplicación cuando creamos ClassB utilizando:

1
2
[ ClasseB alloc ] ; ClasseB classeB * = [ClasseB alloc];
self ] ; [SetDelegate ClasseB: auto];

A continuación, introduzca:

1
2
3
void ) mioEvento : ( id ) sender { - (Void) mioEvento: (id) {emisor
"mioEvento" ) ; NSLog (@ "mioEvento");
}

11 comentarios a "Cómo crear tu propio protocolo con el proxy"

  1. 06 de enero 2011 Louis:

    Hola,
    Cumplidos el artículo!
    Quería aclarar mis dudas sobre el uso de ...

    El delegado normalmente se invoca cuando un evento ocurre ... en este caso después de que creó el "delegado" el método "mioEvento" debe ser invocado por la mano?
    Yo no entendía este paso
    Gracias.

  2. 09 de enero 2011 Giovambattista Fazioli :

    @ Luis: Sí, la clase que soporta el protocolo que hemos creado también tratará de invocar el método delegado. Como se mostró anteriormente en nuestro caso all'accadere clase ejecutar 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];
    }

    O, si se ha configurado un delegado y que el apoyo de la delegada del método solicitado, el método se ejecuta.
    En principio las clases pesonali, de complejidad media, en caso de - este es el caso - supportatre un protocolo para informarles de los acontecimientos y los estados de la misma clase.
    Si otras preguntas escribir bien.

  3. 09 de enero 2011 Louis:

    Gracias ...
    Voy a tener otra pregunta ... surge del hecho de que no he jugueteó con el código y tal vez grabar sin sentido : D

    Puedo crear mi protocolo, y vamos a suponer que recuerdo de ese evento all'accadere un determinado método del protocolo a medida que se han dirigido.
    La implementación del método va a hacer en el curso. M de mi protocolo

    Si llamo a un método que es parte de mi clase que delega (es decir, que utiliza el delegado) como proceder?
    Yo tengo mi idea, pero no voy a escribir bagianate

  4. 09 de enero 2011 Giovambattista Fazioli :

    @ Luis: Si he entendido bien tu pregunta, normalmente se enfrentan a dos casos. Por lo general, tienen un controlador de vista que, además de crear una instancia del objeto que admite un determinado protocolo, también es un delegado. En este caso, cuando se escribe la implementación del método tanto tiene acceso directo a la instancia del objeto que proporciona el protocolo. Esto puede ser esquematizada de la siguiente manera:

    1
    2
    3
    UIViewController <myClassADelegate> { @ MyViewController Interfaz: {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à el objeto del tipo myClassA y, como se ha dicho anteriormente, si funzngerà también de delegado para su myClassA en la implementación del método tendrá acceso a la variable objectA :

    1
    2
    3
    4
    void ) mioEvento { - (Void) {mioEvento
    / / Hacer algo
    ; [Objecta myMethod];
    }

    En laternativa hay casos en los que el delegado es un objeto de otra clase, tales como:

    1
    2
    3
    4
    5
    6
    / / Estamos en un controlador de vista
    ...
    myClassA alloc ] init ] ; Objecta = [[myClassA alloc] init];
    [ [ myClassB alloc ] init ] ; myClassB objectB * = [[myClassB alloc] init];
    objectA.delegate = objectB;
    ...

    . En este caso, un controlador de vista crea una instancia de la clase myClassA señalando a este como delegado myClassB . che, ovviamente, non conosce a priopri il puntatore alla myClassA . El caso planteado por myClassA será administrado por myClassB que, obviamente, no sabe el puntero a priopri myClassA .
    qualcuno deve passargliela; questo qualcuno è il view controller che conosce entrambe. En este caso, si la instancia de myClassB debe interactuar con la instancia de myClassA alguien tiene que pasar, esto es alguien que sabe tanto el controlador de vista. Así que el código anterior debería ser:

    1
    2
    3
    4
    5
    6
    7
    / / Estamos en un 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 a Bank of America
    objectA.delegate = objectB;
    ...

    Si he entendido bien la pregunta ...

  5. 10 de enero 2011 Louis:

    en el primer caso ...
    Que yo llamo el método MyMethod que, obviamente, tendrá una puesta en práctica.

    Bueno ... en que la aplicación se tienen en cuenta para realizar una acción que prevé una invocación de un método o el uso de una variable presente en mi myViewController

    ¿Cómo lo hago?
    Espero haberme explicado!

  6. 10 de marzo 2011 Objective-C: Notificaciones y delegados | Undolog.com :

    [...] Elegante, claro y fácil de usar para hacer frente a estas situaciones. Ya hemos hablado de crear un protocolo con su propio delegado. Objective-C permite definir un protocolo de comunicación a través del cual una o más clases [...]

  7. 02 de febrero 2012 Marca:

    Hola, enhorabuena de mi parte para el artículo .. Tengo una preocupación para la exportación ..
    Me encuentro en el caso en que se encuentran en un controlador de la ficha, cada viewController tiene una clase dedicada a

    tab1: PrimoController
    tab2: OptionController

    lo que quiero hacer es parar y que está en un contador de tiempo startare PrimoController dall'OptionController, este startare temporizador y también puede pasar por el primer controlador con 2 métodos

    1
    2
    3
    4
    5
    6
    void ) startTimer { - (Void) {startTimer
    / / Bla, bla, bla NSTimer
    }
    void ) stopTimer { - (Void) {stopTimer
    / / Temporizador invalidado, bla, bla, bla,
    }

    Yo hice lo siguiente:
    en OptionViewController.h que he creado

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @ Protocolo OptionViewControllerDelegate
    @ Required
    void ) timerActionRestart; - (Void) timerActionRestart;
    @ End

    UITableController @ Interfaz OptionViewController: UITableController

    weak, nonatomic ) id timerHandlerDelegate; @ Property (débil, no atómica) Identificación del timerHandlerDelegate;

    @ End

    en 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];
    }

    }

    Y así, todo está bien .. Yendo lugar en la primera clase la situación es la seguetne:

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

    # Importar "OptionViewController.h"

    NSObject @ Interfaz OptionViewController: NSObject

    / ** PrimaClasse.m ** /
    void ) timerActionRestart - (Void) timerActionRestart
    {
    / / Fin de contador
    / / Inicio del temporizador
    ) ; NSLog ("timer reiniciar");
    }

    Me imagino que debe establecer el delegado, pero al ser 2 clases ya han sido inicializada, no sé cómo!
    ¿Alguna idea?

    Ahora sabe que metodoGestoreTimer se llama, pero no registra nada, ya que no pasa la verificación en el SI ..

    Muchas gracias y nuevamente felicidades por el blog! : D

  8. 02 de febrero 2012 Marca:

    olvidado .. del delegato l'ho messo en OptionViewController la @syntetize puse el delegado : D

  9. 02 de febrero 2012 Marca:

    Disculpen el spam .. Me di cuenta de que hay un error ..
    aquí es la corrección

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

    NSObject @ Interfaz PrimaClasse: NSObject
  10. 02 de febrero 2012 Giovambattista Fazioli :

    @ Marcos: Le sugiero que pensar en un enfoque más correcto. Si ejecuta la subclase del control ficha, este último contiene una lista de todos los controladores de vista. La pregunta debe ser leído en estos términos: la opción de controlador de vista le pregunta a otro controlador para realizar una operación (activar o desactivar un temporizador). La opción de controlador de vista es un "hijo", como el otro, el controlador de la ficha. Por tanto, es más apropiado que el mensaje va desde la opción de controlador para el controlador de vista de la ficha que a su vez smisterà el mensaje a los responsables. El controlador de vista de la ficha sabe todo de su controlador de vista, para que puedan enviar un mensaje a nadie. El punto de vista sabe que su controlador pestaña de opciones de definición de controlador.
    Si tengo tiempo voy a tratar de hacer un ejemplo de código, pero le he dado toda la información que necesita también para actuar solos. Quiero saber si me perdí algo en el camino ...

  11. 02 de febrero 2012 Marca:

    Muchas gracias, me has iluminado : D
    He resuelto mediante el establecimiento de

    1
    2
    3
    4
    5
    6
    7
    / / OptionViewController.m
    void ) viewDidLoad { - (Void) {viewDidLoad
    ....
    / / Partición del delegado para el temporizador de reinicio
    viewControllers = self.tabBarController.viewControllers; NSArray * = viewControllers self.tabBarController.viewControllers;
    viewControllers objectAtIndex : 0 ] ; self.timerHandlerDelegate = [objectAtIndex viewControllers: 0];
    }

    Ahora todo funciona!
    muchas gracias!

Deja un comentario

TAG PERMISOS XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> código de inserción:
 <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 


Deje de SOPA