12
votes

Peu confus sur les délégués dans l'objectif-c

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.

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.

Quiconque se soucie d'élaborer?

merci!


1 commentaires

J'ai eu du mal avec cela quand je commençais à regarder Cacao. Tu n'es pas seul.


6 Réponses :


6
votes

Un bon moyen de comprendre les délégués est par exemple. Un exemple est utableview (ou nstableview , 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é et a datasource (tous deux comme des objets auxiliaires vers le récepteur).

au lieu de utableview 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é "Hey! J'ai été tapé sur cette ligne et cette section, faites ce que vous avez sera!". Typiquement, le délégué 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é a une définition de la méthode) envoie un message comme celui-ci: xxx

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 vide ), l'exécution continue de la vue sur la vue.

Les délégués sont un concept. Ce n'est pas une caractéristique linguistique de l'objectif-c. Le membre délégué d'UitailView est comme n'importe quel autre objet. Bien que les délégués soient généralement non retenus, ils sont attribués à la place (pour éviter retenir cycles).

Ils sont très utiles quand vous obtenez la suspension eux. Je suggère de pratiquer avec des exemples tels que tableviews ( NSTableView , comme je l'ai dit plus tôt, fonctionne de la même manière, juste avec différentes méthodes).


7 commentaires

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 . 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 (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é , 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 . Les méthodes de délégation n'ont pas à retourner void , 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.



7
votes

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


2 commentaires

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



20
votes

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.

cacao fait l'inverse; Les instances demandent plutôt les données quand et si elles sont nécessaires.

Il existe quatre types principaux de méthodes de délégation:

  • conditionnellement avant - signaux que quelque chose est sur le point de se produire, mais le délégué peut avorter. Le nom incluait toujours le mot devrait.
    Exemple: de la barre de recherche doit Enddition: . .
  • inconditionnellement avant - signaux que quelque chose est sur le point d'arriver. Nom toujours incluent le mot Will.
    Exemple: application Terminez: .
  • inconditionnellement après - signaux quelque chose est arrivé. Nom incluez toujours le mot.
    Exemple: application est finitionLaunching: . .
  • personnalisants - Demandez des informations sur la manière de fonctionner. Le nom inclut les informations requises.
    Exemple TABLEVIEW: VIEWFORDERINSECTION : .

    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.


1 commentaires

De loin la meilleure explication entre ces réponses, IMHO



0
votes

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.


0 commentaires

2
votes

Un délégué (ce qui signifie représentatif ) 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 lorsque vous souhaitez les classes associées pour partager des méthodes. Vous utilisez délégués lorsque vous souhaitez classes sans rapport pour partager des méthodes. L'approche déléguée permet à un objet d'une classe hériter des méthodes d'une classe par ailleurs non liée. L'objet "Objet de délégué" ou "Object représentatif" est l'objet qui hérite d'une classe étrangère; Il est désigné comme un représentant, un délégué, de cette classe distante, de sorte que lorsque vous attribuez un objet en tant que délégué à une classe, vous lui donnez la permission de représenter cette classe également, même s'il n'hérite normalement pas de cette classe . (Si elle héritée de la classe, vous n'avez pas besoin de le définir comme délégué de cette classe; il aurait déjà accès aux méthodes de la classe. Mais vous voulez que cet objet sans rapport hérite de certaines méthodes de la classe, ce qui représente que classe, et retourner des informations à sa classe d'expéditeur, vous en faites un représentant délégué de cette classe, même s'il hérite d'un ensemble de classes différents.) Cela permet essentiellement une classe non liée à hériter d'une autre classe non liée, mais avec un Minimum de complications à sa ligne de base d'héritage.

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.

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

dans la documentation Apple, chaque référence de classe montre en haut, "hérite de" et "se conforme à". Par exemple, nsdocumentController hérités de NsObject et est conforme à nsuserinterfacevalidations , nscoding et nsobject (nsobject) . La conformité à nscoding est à partir de la déclaration d'interface dans nsdocumentcontroller.h xxx

et à nsuserinterfacevalidations de la déclaration de méthode dans Nsdocumentcontroller.h xxx

avec le #import xxx

donc alors que NsdocumentController hérités de NsObject , Il veut aussi de l'aide de nscoding et nsuserinterfacevalidation . Et cela obtient de l'aide de ces classes étrangères par conformes à leurs méthodes de protocole , se définissant comme conformes à ces méthodes et importation de fichiers d'en-tête nécessaires pour utiliser ces méthodes .


0 commentaires

0
votes

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.


0 commentaires