2010-12-06 21 views
1

Je suis confus - Je ne comprends pas à quoi sert le délégué?Dilemme de déclaration de délégué

Le délégué application qui est créé par défaut est compréhensible, mais dans certains cas, je l'ai vu quelque chose comme ceci:

@interface MyClass : UIViewController <UIScrollViewDelegate> { 
    UIScrollView *scrollView; 
    UIPageControl *pageControl; 
    NSMutableArray *viewControllers; 
    BOOL pageControlUsed; 
} 

//... 

@end 

Quel est le <UIScrollViewDelegate> pour?

Comment ça marche et pourquoi est-il utilisé?

Répondre

12

<UIScrollViewDelegate> dit que la classe conforme à le protocole UIScrollViewDelegate. Cela signifie que la classe doit implémenter toutes les méthodes requises définies dans le protocole UIScrollViewDelegate. Aussi simple que cela.

Vous pouvez conformer votre classe à plusieurs protocoles si vous le souhaitez:

@implementation MyClass : UIViewController <SomeProtocol, SomeOtherProtocol> 

Le but de se conformer une classe à un protocole est à a) déclarer le type comme conforme du protocole, de sorte que vous pouvez maintenant catégorisez ce type sous id <SomeProtocol>, ce qui est préférable pour les objets délégués auxquels les objets de cette classe peuvent appartenir, et b) Il dit au compilateur de ne pas vous avertir que les méthodes implémentées ne sont pas déclarées dans le fichier d'en-tête, car votre classe est conforme au protocole.

Voici un exemple:

Printable.h

@protocol Printable 

- (void) print:(Printer *) printer; 

@end 

Document.h

#import "Printable.h" 
@interface Document : NSObject <Printable> { 
    //ivars omitted for brevity, there are sure to be many of these :) 
} 
@end 

Document.m

@implementation Document 

    //probably tons of code here.. 

#pragma mark Printable methods 

    - (void) print: (Printer *) printer { 
     //do awesome print job stuff here... 
    } 

@end 

Vous pourriez alors ont plusieurs objets qui sont conformes au protocole Printable, qui pourrait ensuite être utilisé comme une variable d'instance, disons, un objet PrintJob:

@interface PrintJob : NSObject { 
    id <Printable> target; 
    Printer *printer; 
} 

@property (nonatomic, retain) id <Printable> target; 

- (id) initWithPrinter:(Printer *) print; 
- (void) start; 

@end 

@implementation PrintJob 

@synthesize target; 

- (id) initWithPrinter:(Printer *) print andTarget:(id<Printable>) targ { 
    if((self = [super init])) { 
     printer = print; 
     self.target = targ; 
    } 
    return self; 
} 

- (void) start { 
    [target print:printer]; //invoke print on the target, which we know conforms to Printable 
} 

- (void) dealloc { 
    [target release]; 
    [super dealloc]; 
} 
@end 
+4

Pour clarifier davantage la réponse de Jacob ... La raison pour laquelle vous utiliseriez un délégué serait d'assigner une classe pour faire le traitement de tâches spécifiques sur lesquelles l'objet UIScrollView s'appuie pour faire son travail correctement. En termes simples, vous pourriez le considérer comme un assistant personnel. Un patron est trop occupé pour se soucier de la façon dont le déjeuner est commandé, alors il a un délégué (son secrétaire ou autre) qu'il appelle pour commander le déjeuner pour son équipe lors d'une réunion importante. Il dit simplement "Hey Judy, nous avons besoin de déjeuner pour 5 personnes, voici ce qu'ils veulent", Judy prend alors cette information et fait tout ce qui doit être fait pour obtenir le déjeuner. –

+0

Merci Jacob et Flash84x ....:) une autre demande ... pouvez-vous s'il vous plaît me fournir un code de base en utilisant ce type de protocoles ?? La logique est claire .. je veux juste savoir comment l'utiliser ... :) – Hisenberg

2

Je pense que vous devez comprendre le Delegate Pattern. C'est un modèle de base utilisé par les applications iphone/ipad et si vous ne le comprenez pas, vous n'irez pas loin. Le lien vers wikipedia que je viens d'utiliser décrit le modèle et donne des exemples de son utilisation, y compris l'objectif C. Ce serait un bon endroit pour commencer. Jetez également un coup d'oeil au Overview tutorial from Apple qui est spécifique à l'iPhone et qui traite également du modèle Delegate.