Comment créer votre propre protocole avec les déléguées

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

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

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

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

6 commentaires à "Comment créer un protocole avec son propre représentant"

  1. 6 janvier 2011 Louis:

    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.

  2. 9 janvier 2011 Giovambattista Fazioli :

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

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

    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.

  3. 9 janvier 2011 Louis:

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

    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

  4. 9 janvier 2011 Giovambattista Fazioli :

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

    1
    2
    3
    UIViewController <myClassADelegate> { @ Interface myViewController: UIViewController {<myClassADelegate>
    MaClasse * objet;
    }

    e, come detto sopra, se funzngerà anche da delegato per la myClassA nell'implementazione del metodo avrà accesso alla variabile objectA : myViewController instanzierà l'objet de type myClassA et, comme mentionné ci-dessus, si funzngerà également un délégué à myClassA dans la mise en œuvre de la méthode aura accès à la variable objectA :

    1
    2
    3
    4
    void ) mioEvento { - (Void) {mioEvento
    / / 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:

    1
    2
    3
    4
    5
    6
    / / Nous sommes dans un contrôleur de vue
    ...
    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 myClassA pointant vers ce titre de délégué myClassB . che, ovviamente, non conosce a priopri il puntatore alla myClassA . L'événement déclenché par myClassA sera géré par myClassB qui ne sait manifestement pas le pointeur à priopri myClassA .
    qualcuno deve passargliela; questo qualcuno è il view controller che conosce entrambe. Dans ce cas, si l'instance de myClassB doit interagir avec l'instance de myClassA quelqu'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:

    1
    2
    3
    4
    5
    6
    7
    / / Nous sommes dans un contrôleur de vue
    ...
    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 ...

  5. 10 janvier 2011 Louis:

    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é!

  6. 10 mars 2011 Objective-C: Notifications et délégués | Undolog.com :

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

Laisser un commentaire

XHTML TAG PERMIS: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> CODE D'INSERTION:
 <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 


Arrêtez SOPA