web-dev-qa-db-fra.com

Que fait exactement le délégué dans le projet xcode ios?

Je viens d'apprendre le développement d'applications iPhone, mais j'ai du mal à comprendre ce que signifie réellement le délégué? Quelqu'un peut-il me dire par exemple ce qu'il fait et son importance? Merci pour toute aide!

28
Newbie

C'est un concept clé à comprendre conceptuellement, il est donc important de savoir comment y penser avant les détails techniques. Autrement dit, un délégué est un rappel.

Deux scénarios principaux pour utiliser des délégués:

  1. Une classe ou un contrôle veut faire abstraction des détails sur la façon de travailler (comme récupérer des données).
  2. Autorisez les autres à accrocher du code dans un pipeline.

Exemples: UITableView - une vue de table est juste un contrôle qui sait rendre une liste de cellules. Il gère toutes les tâches lourdes de rendu, de défilement, etc ... Mais, il n'a aucune idée de comment charger vos données. Donc, vous implémentez un délégué de source de données qui a des méthodes pour obtenir les données de cellule pour une ligne donnée, etc. Cela vous facilite la tâche. Vous utilisez simplement le contrôle et branchez les détails de vos données. UITableView fera tout pour vous ... répondez simplement à quelques questions spécifiques pour. Un délégué répond à ces quelques questions spécifiques.

Un contrôle texte - vous ajoutez un contrôle texte à votre vue et le tour est joué! vous pouvez le taper et tout va bien. Mais que faire si vous voulez faire quelque chose quand ils commencent à taper ou quand ils ont fini de taper? Eh bien, le contrôle de texte propose un délégué avec des méthodes qui vous permettent de vous connecter au pipeline d'exécution du contrôle de texte. Il permet au contrôle de texte de tout faire pour vous et vous permet d'interjecter du code là où vous en avez besoin. Plusieurs fois, il y a moyen d'intercepter du code pour décider si quelque chose est autorisé. Le contrôle rappellera et demandera, devrais-je être capable de faire x? Vous pouvez intercepter du code et influencer le comportement.

Si vous créez un contrôle ou une classe, vous pouvez créer votre propre protocole, des délégués de source de données, etc. pour que votre contrôle puisse se concentrer sur ce qui est annoncé. Par exemple, supposons que vous vouliez créer un contrôle de tâche. Vous pourriez:

Créez d'abord un contrat. Hé, si vous allez fournir des données pour mon contrôle, ce sont les questions que je vais vous poser. Je vais le reprendre à partir de là ... Dans ce cas, je vais vous demander le nombre de tâches et je vais vous demander de me donner une tâche compte tenu du numéro de ligne.

@protocol XXTaskBoardDelegate <NSObject>
-(NSInteger*)getTaskCount;
-(XXTask*)getTaskForRow:(NSInteger*)rowNumber;
@end

Dans le contrôle ou la classe, donnez au consommateur un moyen de nous donner la classe de source de données déléguée qui répondra aux questions que le contrôle posera. À ce stade, le contrôle est un contrôle pur. Il ne sait rien sur la façon dont vous obtenez vos données. C'est demander un objet (id) qui implémente un contrat/protocole. id

@implementation XXTaskBoard
- (void)setDelegate:(id<XXTaskBoardDelegate>)newDelegate
{
    // the control stores the delegate so it can callback and ask you questions.
}

Ensuite, pour la classe déléguée, dans l'en-tête, déclarez que vous implémentez ce protocole formel et dans le fichier m d'implémentation, vous fournissez le code.

@interface AppController : NSObject<XXTaskBoardDelegate> 
{
    //...
}

puis implémentez-le dans l'implémentation

@implementation AppController
- (NSInteger*)getTaskCount
{
    return [model queryTaskCount];
}

- (XXTask*)getTaskForRow:(NSInteger*)rowNumber
{
    return [[model tasks] getItem:(NSInteger*)rowNumber];
}
41
bryanmac

Un délégué est un objet auquel une autre classe peut transmettre des messages. Dans la pratique, les classes de délégués doivent se conformer à un protocole de délégué.

Par exemple, nous prendrons une sous-classe d'un contrôleur de vue de table. Il s'agit d'un délégué pour votre vue de table. D'abord, vous définissez qu'il s'agit d'un délégué de vue de table en procédant comme suit:

MyTableViewController : UITableViewController <UITableViewDelegate>

Cela signifie que la classe MyTableViewController est une sous-classe de UITableViewController et CONFORME au protocole UITableViewDelegate.

Réglage [tableView setDelegate:self] (ou en le définissant comme tel dans IB) passe ensuite l'objet self à la table view afin que la table table lui envoie des messages.

Le message principal qu'il envoie est le message didSelectRowAtIndexPath qui indique à votre classe que l'utilisateur a appuyé sur une cellule de vue de table.

L'objet qui prend l'événement click (la vue de table) transmet donc le message indiquant que la cellule a été cliquée vers l'objet délégué (qui dans ce cas est votre objet MyTableViewController).

Des protocoles délégués existent afin que vous puissiez vous assurer que l'objet délégué dispose des méthodes nécessaires pour traiter vos messages. Les méthodes d'un protocole délégué peuvent être @optional ou appliqué. Aucune méthode facultative ne doit être définie. Dans votre classe MyTableViewController, la méthode didSelectRowAtIndexPath est facultative - vous n'avez pas besoin de l'avoir. Si la vue de table ne trouve pas la méthode, elle ne l'appellera tout simplement pas.

Cependant, le cellForRowAtIndexPath est nécessaire et sans lui, votre application ne compilera pas.

J'espère que cela vous aide et est simple pour vous. Si vous avez besoin de plus d'informations, faites-le moi savoir.

10
Thomas Clayson

Les délégués sont juste un moyen d'obtenir des rappels de quelque chose. Vous passez un délégué (un pointeur vers un objet conforme à un protocole) à quelque chose et quand il a de nouvelles données pour vous ou lorsqu'un événement se produit que quelque chose appelle une méthode sur le délégué.

Par exemple, lorsque des événements se produisent, comme votre application est mise en arrière-plan ou l'application est sur le point de se terminer, l'objet UIApplication appellera votre délégué d'application pour le lui faire savoir. Lorsqu'un CLLocationManager a une nouvelle position GPS, il appellera votre délégué pour lui transmettre la nouvelle position. UITableViews appelle leurs délégués pour que UITableViewCells s'affiche dans le tableau. Il existe de nombreuses utilisations des délégués dans iOS.

3
progrmr