Fondamentalement, la délégation signifie simplement donner un objet un pointeur à quelque chose dont il a besoin de parler de ce qu'il fait. Dans Cocoa, ceci est généralement traité par des "protocoles", qui sont en quelque sorte l'inverse d'une déclaration d'interface: ils décrivent les méthodes qu'un objet appellera sur un autre objet qui "implémente" le protocole. Ils ne sont pas, à proprement parler, nécessaires, particulièrement dans une situation aussi simple que celle-ci, mais ce sont de bonnes pratiques et c'est une bonne chose de savoir si vous allez écrire du code modulaire.
Dans l'en-tête de la classe d'analyse syntaxique:
// This is the protocol declaration; anything implementing the "ParsingDelegate" protocol needs to have any method signatures listed herein
@protocol ParsingDelegate
- (void)parsingDidEndWithResult:(NSDictionary *)result
@end
@interface ParsingClass : NSObjectOrWhatever
{
...
id<ParsingDelegate> _delegate;
}
...
// We'll use this property to tell this object where to send its messages
@property(nonatomic,assign) id<ParsingDelegate> delegate;
@end
Dans la mise en œuvre de l'analyseur:
@implementation ParsingClass
@synthesize delegate=_delegate;
// the "=_delegate" bit isn't necessary if you've named the instance variable without the underscore
...
Dans la méthode dans laquelle l'analyseur termine sa substance:
...
// make sure the delegate object responds to it
// assigning an object that doesn't conform to the delegate is a warning, not an error,
// but it'll throw a runtime exception if you call the method
if(self.delegate && [self.delegate respondsToSelector:@selector(parsingDidEndWithResult:)])
{
[self.delegate performSelector:@selector(parsingDidEndWithResult:) withObject:someResultObject];
}
...
Dans l'interface utilisateur en-tête de la classe:
@interface SomeUIClass : NSObjectOrWhatever <ParsingDelegate>
Dans la classe de l'interface utilisateur, partout où il met en place l'analyseur,
parser.delegate = self;
puis mettre en œuvre la méthode juste -parsingDidEndWithResult:
sur la classe de l'interface utilisateur. Si plusieurs analyseurs s'exécutent en même temps, vous pouvez étendre la méthode déléguée pour transmettre l'objet analyseur lui-même - c'est un peu le standard Cocoa - mais pour le cas que vous avez décrit, cela devrait faire l'affaire.
Merci pour votre detaile d explication. doit être l'explication la plus concise et pourtant détaillée jusqu'à présent. J'ai des tonnes de livres et ça ne l'explique toujours pas aussi clairement.Bravo – Doz
Le seul problème que j'ai, c'est qu'il y a deux avertissements: (1) respondsToSelector introuvable dans le protocole (2) performSelector non trouvé dans le protocole. Avons-nous oublié quelque chose dans la déclaration protocolaire? – Doz
Vous avez raison-'- respondsToSelector' et' -performSelector' sont les deux méthodes sur 'NSObject', et ne s'appliquent évidemment pas à' id', qui n'a pas d'interface. Je pense que 'id' serait la syntaxe correcte pour déclarer qu'un objet doit adhérer à plusieurs protocoles. –