2009-06-10 25 views
22

Tôi đang cố gắng mở rộng NSImageView để tôi có thể ủy quyền kéo/thả trách nhiệm với bộ điều khiển. Tất cả đều hoạt động tốt với một vấn đề mà trình biên dịch hiện đang hiển thị cảnh báo về việc gửi thư đến các đối tượng có id loại. Để giải quyết điều này, tôi cho rằng tôi chỉ đơn giản là sẽ có hậu tố của loại ivar với tên của giao thức. Tuy nhiên, điều này không thành công với thông báo rằng nó không thể tìm thấy định nghĩa cho giao thức.Xác định và sử dụng các giao thức trong mục tiêu-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 

Bất kỳ con trỏ nào mà tôi có thể gặp khó khăn? Tôi chắc chắn nó phải là một cái gì đó đơn giản, nhưng tôi khá mới để obj-c.

+0

+1 cho câu hỏi hay. –

+0

các từ khóa là: _forward declaration_. – holex

Trả lời

31

Bạn đang đi đúng hướng nhưng bạn đang bị treo lên bởi trình biên dịch C, vốn là một chút cổ xưa. Trình biên dịch bị nghẹt thở vì định nghĩa của giao thức không có sẵn tại thời điểm bạn sử dụng nó. @protocol DragDropImageViewDelegate phải được xác định trước khi bạn có thể sử dụng id< DragDropImageViewDelegate> làm loại. Bạn có thể di chuyển các định nghĩa @protocol trước khi sử dụng (ví dụ: trước khi @ interface của bạn), hoặc thêm một

@protocol DragDropImageViewDelegate; 

trước @ interface (một bản tuyên bố về phía trước) và để lại tờ khai @protocol nó ở đâu.

+0

Đẹp. Cảm ơn bạn. Tôi thực sự phải đi khai báo chuyển tiếp khi di chuyển khai báo giao thức ở trên @implementation đã giới thiệu vấn đề của giao thức hiện đang đề cập đến DragDropImageView trước khi nó được xác định. Cảm ơn sự giúp đỡ của bạn! – Tricky

+0

Vâng, tất nhiên là như vậy. Nói chung, việc khai báo chuyển tiếp là giải pháp cho các phụ thuộc vòng tròn thuộc loại này. –

+0

+1 cho Câu trả lời hay. Tôi có một truy vấn nhỏ, Khi chúng ta viết \ @protocol DragDropImageViewDelegate; trước \ @interface, vậy thì trình biên dịch đã làm gì? –

10

Theo nguyên tắc chung, tôi xác định các giao thức đầu tiên, preceeded bởi

@class DragDropImageView; 

Nhưng bạn có thể làm điều ngược lại và preceed với:

@protocol DragDropImageViewDelegate; 

Để tâm trí của tôi, giao thức là một quan trọng một phần của tuyên bố, và có xu hướng khá ngắn, vì vậy tôi thích nó để đi đầu tiên hơn là bị mất ở dưới cùng của tập tin tiêu đề, nhưng nó là một vấn đề của hương vị.

Các vấn đề liên quan