Même dans le tutoriel le plus simple, vous trouverez l'utilisation de protocoles. Il arrivera certainement pour beaucoup dans votre contrôleur afin d'utiliser un protocole, la saisie, à côté de la définition de l'interface, une déclaration similaire à:
1 2 3 | UIViewController <UIWebViewDelegate> { @ Interface myViewController: UIViewController {<UIWebViewDelegate> ... } |
Les protocoles (dans l'exemple ci-dessus <UIWebViewDelegate> ) sont une manière particulière de l'Objective-C pour hériter du comportement d'une classe à une autre. Dans l'exemple montré ci-dessus de notre contrôleur de vue gère une composante probablement UIWebView . Lorsque vous répondez à des événements de ce dernier, il intègre le protocole UIWebViewDelegate .
, come ad esempio: Ainsi, le protocole mis en œuvre UIWebViewDelegate dans notre contrôleur de vue, nous pouvons mettre dans le fichier de méthodes de déploiement m (messages) qui sera invoquée par le composant. UIWebView , tels que:
1 2 3 | void ) webViewDidFinishLoad : ( UIWebView * ) webView { - (Void) webViewDidFinishLoad: (UIWebView *) {WebView / / Chargement de la page complète } |
En d'autres termes, notre contrôleur de vue part l'interface <UIWebViewDelegate> , qui hérite «certains» caractéristique.
Écrivez votre propre protocole
. Imaginez que nous avons deux classes: ClasseA et ClasseB . che, a sua volta, genera un messaggio quando accade un determinato evento. La classe ClasseA instancie l'intérieur de la ClasseB qui, à son tour, génère un message quand un événement précis. per rispondere e intercettare gli “eventi” rilasciati da ClasseB . Nous serions alors écrire un délégué pour ClasseB qui peut être utilisé par ClasseA à réagir et à intercepter les «événements» émis par ClasseB .
: La première chose à faire est d'ajouter la définition du protocole en ClasseB le long d'une propriété (dans le standard d'Apple) delegate :
1 2 3 4 5 6 7 8 9 10 11 | @ Protocole ClasseBDelegate <NSObject> @ Option void ) mioEvento : ( id ) sender; - (Void) mioEvento: (id) sender; @ Fin NSObject { @ Interface ClasseB: NSObject { / / Autres définitions Identifiant <ClasseBDelegate> délégués; } assign ) id <ClasseBDelegate> delegate; @ Property (céder) Identifiant déléguée <ClasseBDelegate>; |
. Comme une évidence, dans le fichier de M de ClasseB entrez:
1 | @ Synthétiser délégué; |
Dans le fichier de classe d'implémentation ClasseB nous pouvons mettre le «feu» de notre événement de cette façon:
1 2 3 | self.delegate != NULL && [ self.delegate respondsToSelector : @selector ( mioEvento : ) ] ) { if (self.delegate = NULL & & [self.delegate respondsToSelector: @ selector (mioEvento:)]!) { self ] ; [MioEvento délégué: self]; } |
: [self.delegate respondsToSelector:@selector(mioEvento:)] . Tout d'abord nous assurer que vous avez configuré un délégué: self.delegate != NULL et que ce délégué fournit, ou est susceptible de répondre au message mioEvento : [self.delegate respondsToSelector:@selector(mioEvento:)] . ) che è il puntatore all'istanza della classe ClassB . Si ces deux conditions sont remplies alors invoquer mioEvento dans cet exemple de cette manifestation comprend également un paramètre ( id ) qui est le pointeur vers l'instance de la classe ClassB .
: La classe ClassA n'aurez pas à faire est de mettre en œuvre la méthode du délégué et entrez mioEvento :
1 2 3 4 5 6 7 |
Dans le fichier de mise en œuvre lorsque nous créons ClassB va utiliser:
1 2 | [ ClasseB alloc ] ; ClasseB classeB * = [ClasseB alloc]; self ] ; [SetDelegate ClasseB: self]; |
Ensuite, insérer:
1 2 3 | void ) mioEvento : ( id ) sender { - (Void) mioEvento: (id) sender { "mioEvento" ) ; NSLog (@ "mioEvento"); } |










Bonjour,
Article compliments!
Je voulais clarifier mes doutes sur l'utilisation ...
Le délégué est habituellement invoqué quand un événement se produit dans ce cas ... il nous a créés "déléguer" la méthode "mioEvento» doit être invoqué par la main?
Je ne comprenais pas cette étape
Je vous remercie.
@ Louis: Oui, la classe qui supporte le protocole que nous avons créé aura également la tâche d'invoquer la méthode déléguée. Comme indiqué ci-dessus dans notre classe l'événement incident exécuter du code comme:
2
3
self ] ; [MioEvento délégué: self];
}
C'est, si vous avez configuré un délégué et que le soutien déléguer la méthode demandée, alors la méthode est exécutée.
En principe, les classes pesonal, de complexité moyenne, doit - c'est le cas - une supportatre sur leurs états de protocole et des événements de la classe.
Si vous écrivez d'autres questions aussi.
Merci ...
Je vais vous donner encore une question ... provient du fait que je n'ai pas eu un coup de main dans le code et peut-être tirer sur un non-sens
Je crée mon propre protocole, et supposons que l'incident de cet événement Je me souviens d'une méthode particulière du protocole que vous avez réalisé.
La mise en œuvre de la méthode va faire dans le cours. M de mon protocole
Si je dois appeler une méthode qui fait partie de ma classe délégant (c'est à dire celui qui utilise le délégué) comme avant?
J'ai ma propre idée mais je ne veux pas écrire bagianate
@ Louis: Si je comprends bien votre question, vous devriez normalement trouver en face de deux cas. Habituellement, vous avez un contrôleur de vue, en plus d'instancier l'objet qui supporte un protocole donné, il est également un délégué. Dans ce cas, lorsque vous écrivez l'implémentation de la méthode et a un accès direct à l'instance d'objet qui fournit le protocole. Cela peut se résumer comme suit:
2
3
MaClasse * objet;
}
e, come detto sopra, se funzngerà anche da delegato per la
myClassAnell'implementazione del metodo avrà accesso alla variabileobjectA:myViewControllerinstanzierà l'objet de typemyClassAet, comme mentionné ci-dessus, si funzngerà également un délégué àmyClassAdans la mise en œuvre de la méthode aura accès à la variableobjectA:2
3
4
/ / Faire quelque chose
; [Objet myMethod];
}
Avec en alternance dans les cas où il ya le délégué d'un objet est une classe différente, tels que:
2
3
4
5
6
...
myClassA alloc ] init ] ; objet = [[MaClasse alloc] init];
[ [ myClassB alloc ] init ] ; myClassB ObjectBar * = [[myClassB alloc] init];
ObjectBar objectA.delegate =;
...
. Dans ce cas, un contrôleur de vue instancie la classe
myClassApointant vers ce titre de déléguémyClassB. che, ovviamente, non conosce a priopri il puntatore allamyClassA. L'événement déclenché parmyClassAsera géré parmyClassBqui ne sait manifestement pas le pointeur à prioprimyClassA.qualcuno deve passargliela; questo qualcuno è il view controller che conosce entrambe. Dans ce cas, si l'instance de
myClassBdoit interagir avec l'instance demyClassAquelqu'un doit le passer, c'est l'idée que quelqu'un qui connaît les deux contrôleurs. Donc le code ci-dessus devrait être comme ceci:2
3
4
5
6
7
...
myClassA alloc ] init ] ; objet = [[MaClasse alloc] init];
[ [ myClassB alloc ] init ] ; myClassB ObjectBar * = [[myClassB alloc] init];
objectA ] ; // informa B di A [SetObjectAPointer ObjectBar: Object] / / informe B de A
ObjectBar objectA.delegate =;
...
Si j'ai bien compris la question ...
Dans le premier cas ...
J'appelle la méthode myMethod qui ont évidemment une mise en œuvre.
Eh bien ... en ce que nous en œuvre pour le compte d'une action qui nécessite une invocation d'une méthode ou l'utilisation d'une variable présente dans mon myViewController
Comment puis-je?
J'espère que j'ai expliqué!
[...] Élégant, clair et facile à utiliser pour faire face à ces situations. Nous avons déjà parlé dans Créer un protocole avec son propre délégué. Objective-C vous permet de définir un protocole de communication par lequel une ou plusieurs classes [...]