Je connais un bon bit d'objectif-c et je travaille sur un livre de SDK iPhone (provenant d'un livre Obj-C qui vient d'avoir des programmes de console). Il a tenté d'expliquer les délégués bien que cela a été précipité et ne comprenait pas vraiment ce que cela essayait de transmettre. Je suis un peu confus sur ce qu'ils sont et quand vous les utiliseriez. p>
En gros, il a dit qu'ils sont des cours qui assument la responsabilité de faire certaines choses pour le compte d'un autre objet. p>
Quiconque se soucie d'élaborer? p>
merci! p>
6 Réponses :
Un bon moyen de comprendre les délégués est par exemple. Un exemple est au lieu de depuis votre Le contrôleur est le délégué de la table et il met en œuvre cette méthode, il décide de quoi faire. Lorsque la méthode se termine (dans ce cas, il devrait simplement renvoyer Les délégués sont un concept. Ce n'est pas une caractéristique linguistique de l'objectif-c. Le membre Ils sont très utiles quand vous obtenez la suspension eux. Je suggère de pratiquer avec des exemples tels que tableviews ( utableview code> (ou
nstableview code>, selon que nous parlons de l'iPhone ou du Mac OS). De toute façon, la vue de la table a un
délégué code> et a
datasource code> (tous deux comme des objets auxiliaires vers le récepteur).
utableview code> Traitement des événements Lorsque, par exemple, une de ses lignes est exploitée par un utilisateur, elle indique à la place à son
délégué code> "Hey! J'ai été tapé sur cette ligne et cette section, faites ce que vous avez sera!". Typiquement, le
délégué code> est un contrôleur d'une sorte, qui implémente la méthode correcte. Donc, la vue Table (après avoir vérifié si le délégué
code> a une définition de la méthode) envoie un message comme celui-ci: p>
vide code>), l'exécution continue de la vue sur la vue. P>
délégué code> d'UitailView est comme n'importe quel autre objet. Bien que les délégués soient généralement
retenir code> cycles). P>
NSTableView code>, comme je l'ai dit plus tôt, fonctionne de la même manière, juste avec différentes méthodes). P> P>
Donc, ils sont une classe qu'un objet appelle quand quelque chose se fait à lui-même. Et en fonction de ce qui a été fait à lui-même, il appelle une certaine méthode de la classe du délégué. Correct? Leur moyen de créer une classe de délégation ou est-ce juste une autre classe ordinaire avec des méthodes que d'autres classes s'appliquent?
Techniquement, le délégué est un objet. Vous pourriez avoir une cinquantaine d'instances d'un objet qui implémente certaines méthodes de délégation, mais uniquement l'instance qui est définie car le délégué a ses méthodes appelées. La manière appropriée de créer un délégué est de définir un protocole, ce qui définit un ensemble de méthodes qui doivent / peuvent être mises en œuvre.
@Avizz: Vous avez raison, un délégué peut être n'importe quel type d'objet que vous souhaitez. Bien que typiquement, ce ne sera généralement celui que est conforme à un protocole code>. Si un objet est conforme à un protocole donné, cela signifie fondamentalement «Je promets que j'ai mis en œuvre tout ce qui est nécessaire de moi dans le protocole donné». De cette façon, lorsqu'un objet envoie un message à un délégué, ils ont confiance que le délégué sait quoi faire .
Une autre chose assurez-vous que je suis correct sur ... Lorsque vous dites qu'une cellule est cliquée, il utilise une instance d'objet délégué et l'envoie un message. La classe de déléguée a une méthode pour faire face à ce qu'elle est reçue et la méthode basée sur les informations qu'il a reçues fait quelque chose? Correct?
@Avizz: Correct. Dans mon exemple de table, lorsque la cellule est sélectionnée, la table prépare ensuite un objet appelé indexPath code> (qui dit quelle ligne a été sélectionnée) puis passe au délégué dans l'appel de méthode ci-dessus. Donc,
délégué code>, qui pourrait être aussi simple qu'une sous-classe NSOBJECT, implémente la méthode ci-dessus. Lorsque la table l'appelle, avec cet index, notre délégué effectue la méthode, à l'aide de l'index de l'index, fait sa chose et renvoie
void code>. Les méthodes de délégation n'ont pas à retourner
void code>, mais celui-ci le fait. Certains retournent un bool, certains flotteurs de retour (hauteur cellulaire par exemple), etc.
Les sources de données ne sont pas des délégués.
@bbum: correct, je vais clarifier.
Le mot Let que vous voulez présenter à l'utilisateur une alerte, et que vous voulez une méthode pour exécuter lorsque l'utilisateur touche l'un des boutons. Le problème est, comment savez-vous quelle méthode d'appel, sur quel objet, quand quelqu'un touche un bouton?
Pour qu'une classe soit un délégué, vous devez déclarer comme tel. Dans l'exemple ci-dessus, permet de dire que vous avez un objet ApplicationController qui contrôle le flux de votre application. Dans la déclaration, nous dirions p>
if( buttonIndex == 0 ) { _myString = @"Pressed the button"; } else { _myString = @"Pressed the other button"; }
qu'est-ce que le symbole arobase signifie?
Cela dépend de lequel vous vous référez. Vous pouvez définir des chaînes en place en disant @ "String ici", qui est une chose syntaxique de l'objectif C. Sinon, @interface est une déclaration de classe. Beaucoup d'objectifs C des choses spécifiques commencent par @, car il n'est jamais utilisé dans des identifiants C / C ++. Il permet aux développeurs de l'objectif c de s'assurer qu'il n'y a aucune confusion quant à savoir si quelque chose provient de C / C ++ ou de l'objectif c
Pensez aux délégués comme inversion de la direction des dépendances. Dans la plupart des cadres, les clients injecteront les dépendances requises dans des instances, généralement dans le constructeur ou par des setters. P>
cacao fait l'inverse; Les instances demandent plutôt les données quand et si elles sont nécessaires. P>
Il existe quatre types principaux de méthodes de délégation: P>
de la barre de recherche code> doit cod> strud> Enddition: code>. Li>.
- inconditionnellement avant em> - signaux que quelque chose est sur le point d'arriver. Nom toujours incluent le mot Will.
Exemple: application code> code> strud> Terminez: CODE>. LI>
- inconditionnellement après em> - signaux quelque chose est arrivé. Nom incluez toujours le mot.
Exemple: application code> est code> strud> finitionLaunching: code>. Li>.
- personnalisants em> - Demandez des informations sur la manière de fonctionner. Le nom inclut les informations requises.
Exemple TABLEVIEW: CODE> VIEWFORDERINSECTION CODE> STROND> : CODE>. LI>
ul>
Tous les méthodes de délégation ont toujours leur expéditeur comme l'un des arguments. Toute méthode déléguée peut avoir une valeur de retour qui modifie la manière dont l'expéditeur se comporte. P>
De loin la meilleure explication entre ces réponses, IMHO
Jetez un coup d'œil à mon tutoriel sur le modèle de conception des délégués ici: http: // www .jonmsterling.com / blog /? p = 74 . J'espère que cela aide. P>
Un délégué (ce qui signifie représentatif em>) est un objet de classe ('S) qui veut également représenter (hériter de) une autre classe non liée. L'objet délégué est en mesure d'hériter d'une classe autrement non liée par «conforme à» (avoir des implémentations de mise en œuvre) les méthodes de protocole requises de la classe non liée, indiquant à la classe étrangère que cet objet est désormais capable de voler ses informations les plus élémentaires de manière appropriée. Vous utilisez héritage strong> lorsque vous souhaitez les classes associées em> pour partager des méthodes. Vous utilisez Vous utilisez le système de délégué lorsque vous souhaitez que un objet exécute du code d'une classe distincte. Par exemple, comme décrit ici , lorsque vous appuyez sur Entrée dans un champ de texte, le champ de texte ne sait pas vraiment quoi faire avec cette information. Ce qu'il fait, c'est que la classe d'objet de délégué (telle que le contrôleur de fenêtre du document ou le document) et utilise la méthode pertinente de la classe conforme à la méthode correspondante du champ de texte trouvé dans son protocole de délégué de texte, quelque chose comme TextFieldShouldretURN. Donc, dans ce cas, vous définissez le contrôleur de fenêtre ou le document comme délégué du champ de texte, car le champ de texte a besoin de cette classe pour représenter les informations fournies. P> Classe A a besoin d'une méthode de la classe B, mais la classe A n'hérite pas de la classe B. Tout d'abord, indiquez au compilateur que la classe A est conforme au protocole de classe B: p> dans la documentation Apple, chaque référence de classe montre en haut, "hérite de" et "se conforme à". Par exemple, et à avec le donc alors que nsdocumentController code> hérités de
NsObject code> et est conforme à
nsuserinterfacevalidations code>,
nscoding code> et
nsobject (nsobject) code>. La conformité à
nscoding code> est à partir de la déclaration d'interface dans nsdocumentcontroller.h p>
nsuserinterfacevalidations code> de la déclaration de méthode dans Nsdocumentcontroller.h p>
#import code> p>
NsdocumentController code> hérités de
NsObject code>, Il veut aussi de l'aide de fort>
nscoding code> et
nsuserinterfacevalidation code>. Et cela obtient de l'aide de ces classes étrangères par conformes à leurs méthodes de protocole forts>,
Vous n'êtes pas seul, j'apprends toujours cela moi-même. Je pense que c'est mieux si j'essaie de l'expliquer en mots au lieu du code. Il existe un protocole qui détient une certaine méthode ou une certaine action que vous souhaitez accomplir. Le délégué prend la méthode du protocole afin de pouvoir l'utiliser pour faciliter une action ou une méthode. J'ai trouvé cet article très utile http://rypress.com/tatudials/objective-c/protocols . J'espère que cela t'aides. p>
J'ai eu du mal avec cela quand je commençais à regarder Cacao. Tu n'es pas seul.