22

NSImageViewを拡張して、ドラッグアンドドロップの責任をコントローラーに委任できるようにしようとしています。コンパイラがタイプIDのオブジェクトへのメッセージの送信に関する警告を表示するという1つの問題で、すべて正常に機能します。これを解決するには、ivarのタイプにプロトコルの名前の接尾辞を付けるだけでよいと思いました。ただし、これは、プロトコルの定義が見つからないというメッセージで惨めに失敗します。

#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

私が間違っているかもしれないポインタはありますか?単純なものに違いないと思いますが、私はobj-cを初めて使用します。

4

2 に答える 2

31

あなたは正しい方向に進んでいますが、少し古風なCコンパイラに夢中になっています。プロトコルの定義が使用時に利用できないため、コンパイラが窒息しています。@protocol DragDropImageViewDelegateタイプとして使用する前に定義する必要がありますid< DragDropImageViewDelegate>。@protocol定義を使用前(つまり、@ interfaceの前)に移動するか、@interfaceを追加できます。

@protocol DragDropImageViewDelegate;

@interface(前方宣言)の前に、@protocol宣言をそのままにしておきます。

于 2009-06-10T14:49:16.627 に答える
10

原則として、私は最初にプロトコルを定義し、その前に

@class DragDropImageView;

ただし、逆の操作を行って、次のように進めることができます。

@protocol DragDropImageViewDelegate;

私の考えでは、プロトコルは宣言の重要な部分であり、非常に短い傾向があるため、ヘッダーファイルの下部で失われるのではなく、最初に実行することをお勧めしますが、それは好みの問題です。

于 2009-06-11T02:03:54.297 に答える