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










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.
@ 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:
2
3
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.
Gracias ...
Voy a tener otra pregunta ... surge del hecho de que no he jugueteó con el código y tal vez grabar sin sentido
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
@ 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:
2
3
* MyClassA Objecta;
}
e, come detto sopra, se funzngerà anche da delegato per la
myClassAnell'implementazione del metodo avrà accesso alla variabileobjectA:myViewControllerinstanzierà el objeto del tipomyClassAy, como se ha dicho anteriormente, si funzngerà también de delegado para sumyClassAen la implementación del método tendrá acceso a la variableobjectA:2
3
4
/ / Hacer algo
; [Objecta myMethod];
}
En laternativa hay casos en los que el delegado es un objeto de otra clase, tales como:
2
3
4
5
6
...
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
myClassAseñalando a este como delegadomyClassB. che, ovviamente, non conosce a priopri il puntatore allamyClassA. El caso planteado pormyClassAserá administrado pormyClassBque, obviamente, no sabe el puntero a prioprimyClassA.qualcuno deve passargliela; questo qualcuno è il view controller che conosce entrambe. En este caso, si la instancia de
myClassBdebe interactuar con la instancia demyClassAalguien tiene que pasar, esto es alguien que sabe tanto el controlador de vista. Así que el código anterior debería 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 a Bank of America
objectA.delegate = objectB;
...
Si he entendido bien la pregunta ...
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!
[...] 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 [...]
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
2
3
4
5
6
/ / Bla, bla, bla NSTimer
}
void ) stopTimer { - (Void) {stopTimer
/ / Temporizador invalidado, bla, bla, bla,
}
Yo hice lo siguiente:
en
OptionViewController.hque he creado2
3
4
5
6
7
8
9
10
@ 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.mI:2
3
4
5
6
7
8
{
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:
2
3
4
5
6
7
8
9
10
11
12
13
# 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
metodoGestoreTimerse llama, pero no registra nada, ya que no pasa la verificación en el SI ..Muchas gracias y nuevamente felicidades por el blog!
olvidado .. del delegato l'ho messo en
OptionViewControllerla@syntetizepuse el delegadoDisculpen el spam .. Me di cuenta de que hay un error ..
aquí es la corrección
2
3
4
# Importar "OptionViewController.h"
NSObject @ Interfaz PrimaClasse: NSObject
@ 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 ...
Muchas gracias, me has iluminado
He resuelto mediante el establecimiento de
2
3
4
5
6
7
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!