objective-c macos cocoa-touch cocoa nsdragginginfo

objective c - Definición y uso de protocolos en object-c.



objective-c macos (2)

Como regla general, primero defino el protocolo, precedido por

@class DragDropImageView;

Pero puedes hacer lo contrario y preceder con:

@protocol DragDropImageViewDelegate;

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

Estoy tratando de extender NSImageView para poder delegar la responsabilidad de arrastrar y soltar al controlador. Todo funciona bien con el único problema de que el compilador ahora muestra advertencias sobre el envío de mensajes a objetos con id de tipo. Para resolver esto, asumí que simplemente tendría que poner un sufijo del tipo de ivar con el nombre del protocolo. Sin embargo, esto falla miserablemente con el mensaje de que no puede encontrar la definición del protocolo.

#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

¿Algún indicador de dónde podría ir mal? Estoy seguro de que debe ser algo simple, pero soy bastante nuevo en obj-c.


Estás en el camino correcto, pero el compilador C te está quedando colgado, lo cual es un poco arcaico. El compilador se está atragantando porque la definición del protocolo no está disponible en el momento de usarlo. @protocol DragDropImageViewDelegate debe definirse antes de que pueda usar id< DragDropImageViewDelegate> como un tipo. Puede mover la definición de @protocol antes del uso (es decir, antes de su @interface), o agregar una

@protocol DragDropImageViewDelegate;

antes de @interface (una declaración de reenvío) y deje la declaración de @protocol donde está.