2009-06-10 9 views
22

में प्रोटोकॉल को परिभाषित करना और उपयोग करना मैं एनएसआईमेज व्यू को विस्तारित करने की कोशिश कर रहा हूं, इसलिए मैं नियंत्रक को ड्रैग/ड्रॉप जिम्मेदारी का प्रतिनिधित्व कर सकता हूं। यह सब एक समस्या के साथ ठीक काम करता है कि संकलक अब टाइप आईडी वाले ऑब्जेक्ट्स को संदेश भेजने के बारे में चेतावनियां प्रदर्शित कर रहा है। इसे हल करने के लिए मैंने माना कि मुझे बस प्रोटोकॉल के नाम से इवर के प्रकार को प्रत्यय करना होगा। हालांकि, यह संदेश के साथ बुरी तरह विफल रहता है कि इसे प्रोटोकॉल की परिभाषा नहीं मिल सकती है।उद्देश्य-सी

#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 के लिए काफी नया हूँ।

+0

+1। –

+0

कीवर्ड हैं: _forward declaration_। – holex

उत्तर

31

आप सही रास्ते पर हैं लेकिन आप सी कंपाइलर द्वारा लटका रहे हैं, जो कि थोड़ा पुरातन है। कंपाइलर चकित कर रहा है क्योंकि प्रोटोकॉल की परिभाषा उस समय उपलब्ध नहीं है जब आप इसका इस्तेमाल करते हैं। @protocol DragDropImageViewDelegate को एक प्रकार के रूप में id< DragDropImageViewDelegate> का उपयोग करने से पहले परिभाषित किया जाना चाहिए। आप उपयोग से पहले @protocol परिभाषा के लिए कदम (यानी आपका @interface से पहले), या एक

@protocol DragDropImageViewDelegate; 
@interface से पहले

(क आगे घोषणा) जोड़ सकते हैं और @protocol घोषणा यह वह जगह है जहाँ छोड़ सकते हैं।

+0

सुंदर। धन्यवाद। मुझे वास्तव में आगे की घोषणा के लिए जाना पड़ा क्योंकि @ कार्यान्वयन के ऊपर प्रोटोकॉल घोषणा को स्थानांतरित करने से प्रोटोकॉल के मुद्दे को पेश किया गया था, जिसे अब परिभाषित करने से पहले DragDropImageView का जिक्र किया गया था। आपकी मदद के लिए धन्यवाद! – Tricky

+0

हां, ज़ाहिर है कि यह होगा। सामान्य रूप से, आगे की घोषणा इस प्रकार की परिपत्र निर्भरताओं का समाधान है। नाइस उत्तर के लिए –

+0

+1। मेरे पास एक छोटी सी क्वेरी है, जब हम \ @protocol DragDropImageViewDelegate लिखते हैं; \ @interface से पहले, तो कंपाइलर द्वारा क्या किया जाता है? –

10

एक सामान्य नियम के रूप में, मैं प्रोटोकॉल पहले से

@class DragDropImageView; 

preceeded परिभाषित लेकिन आप रिवर्स और साथ के बाद का होना कर सकते हैं:

@protocol DragDropImageViewDelegate; 

मेरे मन के लिए, प्रोटोकॉल एक महत्वपूर्ण है घोषणा का हिस्सा है, और काफी छोटा हो जाता है, इसलिए मैं इसे हेडर फ़ाइल के नीचे खोने के बजाय पहले जाना पसंद करता हूं, लेकिन यह स्वाद का विषय है। अच्छे प्रश्न के लिए