Question

I'm trying to extend NSImageView so I can delegate the drag/drop responsibility to the controller. It all works fine with the one problem that the compiler is now displaying warnings about sending messages to objects with type id. To solve this I assumed I would simply have to suffix the ivar's type with the name of the protocol. However, this fails miserably with the message that it cannot find the definition for the protocol.

#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

Any pointers where I might be going wrong? I'm sure it must be something simple, but I'm quite new to obj-c.

Was it helpful?

Solution

You're on the right track but you're getting hung up by the C compiler, which is a little archaic. The compiler is choking because the definition of the protocol is not available at the time you use it. @protocol DragDropImageViewDelegate must be defined before you can use id< DragDropImageViewDelegate> as a type. You can move the @protocol definition before the usage (i.e. before your @interface), or add a

@protocol DragDropImageViewDelegate;

before the @interface (a forward declaration) and leave the @protocol declaration where it is.

OTHER TIPS

As a general rule, I define the protocol first, preceeded by

@class DragDropImageView;

But you can do the reverse and preceed with:

@protocol DragDropImageViewDelegate;

To my mind, the protocol is an important part of the declaration, and tends to be quite short, so I prefer it to go first rather than be lost at the bottom of the header file, but its a matter of taste.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top