2009-06-10 7 views
22

J'essaie d'étendre NSImageView afin que je puisse déléguer la responsabilité glisser/déposer au contrôleur. Tout fonctionne correctement avec le seul problème que le compilateur affiche maintenant des avertissements sur l'envoi de messages aux objets avec l'ID de type. Pour résoudre cela, j'ai supposé que je devrais simplement suffixer le type de l'ivar avec le nom du protocole. Cependant, ceci échoue lamentablement avec le message qu'il ne peut pas trouver la définition pour le protocole.Définition et utilisation de protocoles dans l'objectif-c

#import <Cocoa/Cocoa.h> 


@interface DragDropImageView : NSImageView { 
    id <DragDropImageViewDelegate> _delegate; 
} 

@property (readwrite, retain) id <DragDropImageViewDelegate> delegate; 

@end 

@protocol DragDropImageViewDelegate 

@optional 

- (NSDragOperation)dragDropImageView:(DragDropImageView *)ddiv validateDrop:(id  <NSDraggingInfo>)info; 
- (BOOL)dragDropImageView:(DragDropImageView *)ddiv acceptDrop:(id <NSDraggingInfo>)info; 
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender; 

@end 

Des pointeurs où je pourrais me tromper? Je suis sûr que cela doit être quelque chose de simple, mais je suis assez nouveau pour obj-c.

+0

+1 pour une bonne question. –

+0

les mots-clés sont: _forward declaration_. – holex

Répondre

31

Vous êtes sur la bonne voie, mais vous êtes bloqué par le compilateur C, qui est un peu archaïque. Le compilateur est en train de s'étouffer parce que la définition du protocole n'est pas disponible au moment où vous l'utilisez. @protocol DragDropImageViewDelegate doit être défini avant de pouvoir utiliser id< DragDropImageViewDelegate> en tant que type. Vous pouvez déplacer la définition de @protocol avant l'utilisation (à savoir avant votre @interface), ou ajouter un

@protocol DragDropImageViewDelegate; 

avant la @interface (une déclaration avant) et laisser la déclaration de @protocol où il est.

+0

Magnifique. Je vous remercie. En fait, je devais aller pour la déclaration avant que le déplacement de la déclaration de protocole au-dessus de la @implementation introduit le problème du protocole se référant maintenant à DragDropImageView avant qu'il ait été défini. Merci pour votre aide! – Tricky

+0

Oui, bien sûr que ce serait. En général, la déclaration forward est la solution aux dépendances circulaires de ce type. –

+0

+1 pour une bonne réponse. J'ai une petite requête, Lorsque nous écrivons \ @protocol DragDropImageViewDelegate; avant \ @interface, alors que fait le compilateur? –

10

En règle générale, je définir le protocole d'abord, précédé par

@class DragDropImageView; 

Mais vous pouvez faire l'inverse et Preced avec:

@protocol DragDropImageViewDelegate; 

À mon avis, le protocole est un important partie de la déclaration, et a tendance à être assez court, je préfère donc aller en premier plutôt que d'être perdu au bas du fichier d'en-tête, mais c'est une question de goût.

Questions connexes