Protocole & Delegate
yass_1988
Membre
Bonjour,
essayent de mieux comprendre le fonctionnement des protocoles et des delegates, j'essaye de mettre un place un exemple test.
Voila mon protocole:
La classe qui implémente ce protocole:
hello.h
hello.m
Et ma classe test:
testViewControlle.h
viewController.m
Je pensais avoir bien fait, mais visiblement non, rien ne s'affiche!!! "Bonjour: (nulle)"
Quelqu'un pour me corriger ?
essayent de mieux comprendre le fonctionnement des protocoles et des delegates, j'essaye de mettre un place un exemple test.
Voila mon protocole:
[color=#73492c]#import [/color]<Foundation/Foundation.h><br />
<br />
[color=#b41ca4]@protocol[/color] helloDelegate <[color=#7134aa]NSObject[/color]><br />
<br />
-([color=#7134aa]NSString[/color] *)getTexte;<br />
<br />
@end
La classe qui implémente ce protocole:
hello.h
[color=#73492c]#import [/color]<Foundation/Foundation.h><br />
[color=#c72c25][color=#73492c]#import [/color]"helloDelegate.h"[/color]<br />
<br />
[color=#578187][color=#b41ca4]@interface[/color][color=#000000] hello : [/color][color=#7134aa]NSObject[/color][color=#000000] <[/color]helloDelegate[color=#000000]>[/color][/color]<br />
<br />
-([color=#7134aa]NSString[/color] *)getTexte;<br />
<br />
@end
hello.m
<br />
<br />
-([color=#7134aa]NSString[/color] *)getTexte<br />
{<br />
[color=#7134aa]NSString[/color] * bonjour=[color=#c72c25]@"hello"[/color];<br />
[color=#b41ca4]return[/color] bonjour;<br />
}<br />
Et ma classe test:
testViewControlle.h
<br />
<br />
[color=#c72c25][color=#73492c]#import [/color]<UIKit/UIKit.h>[/color]<br />
[color=#c72c25][color=#73492c]#import [/color]"helloDelegate.h"[/color]<br />
[color=#c72c25][color=#73492c]#import [/color]"hello.h"[/color]<br />
<br />
<br />
<br />
[color=#578187][color=#b41ca4]@interface testV[/color][color=#000000]iewController : [/color][color=#000000]UIViewController{[/color][/color]<br />
<br />
[color=#578187][color=#000000] [/color][color=#b41ca4]id[/color][color=#000000]<[/color]helloDelegate[color=#000000]> delegate;[/color][/color]<br />
}<br />
[color=#b41ca4]@end[/color]<br />
viewController.m
<br />
<br />
[color=#c72c25][color=#73492c]#import [/color]"testViewController.h"[/color]<br />
<br />
[color=#c72c25][color=#B41CA4]@implementation[/color] testViewController[/color]<br />
[color=#c72c25]...[/color]<br />
<br />
[color=#C72C25]- ([color=#b41ca4]void[/color])viewDidLoad[/color]<br />
[color=#C72C25]{[/color]<br />
[color=#401082][color=#000000] [[/color][color=#b41ca4]super[/color][color=#000000] [/color]viewDidLoad[color=#000000]];[/color][/color]<br />
[color=#C72C25][color=#000000] [/color][color=#401082]NSLog[/color][color=#000000]([/color]@"Bonjour: %@"[color=#000000],[[/color][color=#578187]delegate[/color][color=#000000] [/color][color=#38595d]getTexte[/color][color=#000000]]);[/color][/color]<br />
[color=#C72C25][color=#000000]}[/color][/color]<br />
[color=#C72C25][color=#000000]....[/color][/color]<br />
Je pensais avoir bien fait, mais visiblement non, rien ne s'affiche!!! "Bonjour: (nulle)"
Quelqu'un pour me corriger ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ce n'est utile que pour les méthodes indiquées @optional dans le delegate, ça. Si elles sont @required (comme c'est le cas par défaut), le compilateur le dira si l'objet n'implémente pas la méthode /wink.png' class='bbc_emoticon' alt=';)' />
et dans le cas ou plusieurs objets implémente le même protocole ? Il faudra les instancié autant de fois et les affecter au delegate de TestViewController ensuite, au fur à mesure que j'en ai besoin ?
Petite remarque quand même, je ne veux plus revoir des méthodes du genre "- (NSString*)getText".
Si tu veux utiliser le terme 'get' c'est que tu vas passer un pointeur en argument (cf -getValue: de NSValue).
et sinon dernière question, imaginons que j'ai un protocole nommé ActionDelegate implémenter par RenameAction et maintenant je suis dans une autre classe "x" qui comprend une méthode dont le type de retour serais de type ActionDelegate.
Est ce que syntaxiquement c'est correct d'écrire:
ou alors
Ou alors faut rajouter autre chose ?
http://forums.mediabox.fr/wiki/tutoriaux/apple/protocol
Une méthode d'une classe "x"
Sachant que RenameAction implémente ActionDelegate.
Je sais qu'en JAVA par exemple, une classe qui implémente une interface, et une méthode d'une autre classe qui retourne une instance de la classe qui implémente l'interface. On peut spécifier en type de retour de la méthode, le nom de l'interface.
Voila en faite ma question étais plus dans ce sens là .
Quand tu parle de notation jamais utilisé, tu parle de ça ?
Personnellement je m'en sert souvent, surtout quand tu crée des API par protocole et non par interface et que tu combine le tout avec des builder.
Tout comme je ferais en JAVA avec les interfaces, pour ceux qui connaissent.
Le faite que j'ai comme type de retour id<ActionDelegate>, c'est que l'objet qui va encapsuler le retour de ma méthode, ne sache concrétement qu'il manipule RenameAction.
Après est ce que ce que j'ai écris répond à mon problème, je ne sais pas.
Après pour la suite, en ce qui concerne l'objet qui va encapsuler l'objet retourner par la méthode, j'hésite:
class x:
class y:
ou alors:
class x:
class y:
Sauf que si la première est correcte, mon niveau d'abstraction sera au plus haut, or si je prend la deuxième option, qui elle est sur de fonctionner, mon niveau d'abstraction devient très bas.
Non, ce n'est pas de la notation dont je parlais, mais de l'exemple que yass nous donnait, où on renvoie une instance d'une classe conforme à ce protocole.
Par contre, histoire de bien préciser les choses pour yass_1988 :
Oui bah justement, renvoyer une instance d'une classe conforme à un protocole c'est ce que l'on va faire dans un builder / une factory method.
bon du coup, je reste sur ma 1er option.