2009-06-10 7 views
22

Estoy tratando de extender NSImageView para que pueda delegar la responsabilidad de arrastrar/soltar al controlador. Todo funciona bien con el único problema de que el compilador ahora está mostrando advertencias sobre el envío de mensajes a objetos con identificación tipo. Para resolver esto, asumí que simplemente tendría que ponerle un sufijo al tipo de ivar con el nombre del protocolo. Sin embargo, esto falla miserablemente con el mensaje de que no puede encontrar la definición para el protocolo.Definición y uso de protocolos en Object-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 

¿Alguna sugerencia en la que podría estar fallando? Estoy seguro de que debe ser algo simple, pero soy bastante nuevo en obj-c.

+0

+1 por buena pregunta. –

+0

las palabras clave son: _forward declaration_. – holex

Respuesta

31

Estás en el camino correcto pero estás colgado por el compilador de C, que es un poco arcaico. El compilador se está ahogando porque la definición del protocolo no está disponible en el momento en que lo usa. @protocol DragDropImageViewDelegate debe definirse antes de poder usar id< DragDropImageViewDelegate> como tipo. Puede mover la definición @protocol antes del uso (es decir, antes de que su @interface), o añadir un

@protocol DragDropImageViewDelegate; 

antes de la @interface (una declaración hacia adelante) y dejar la declaración @protocol donde está.

+0

Hermoso. Gracias. De hecho, tuve que ir para la declaración forward ya que al mover la declaración del protocolo por encima de @implementation introdujo el problema del protocolo que ahora hace referencia a DragDropImageView antes de que se haya definido. ¡Gracias por su ayuda! – Tricky

+0

Sí, por supuesto que sí. En general, la declaración directa es la solución para dependencias circulares de este tipo. –

+0

+1 por respuesta agradable. Tengo una pequeña consulta, cuando escribimos \ @protocol DragDropImageViewDelegate; antes de \ @interface, ¿qué hace el compilador? –

10

Como regla general, que definen el protocolo en primer lugar, precedido por

@class DragDropImageView; 

pero se puede hacer a la inversa y preceder con:

@protocol DragDropImageViewDelegate; 

En mi opinión, el protocolo es un importante parte de la declaración, y tiende a ser bastante corta, por lo que prefiero que vaya primero en lugar de perderse en la parte inferior del archivo de encabezado, pero es una cuestión de gusto.

Cuestiones relacionadas