2012-03-06 17 views
32

संकलित नहीं करता है मैंने एक वैकल्पिक विधि के साथ प्रोटोकॉल लागू किया है और कॉलिंग विधि में मैं संदेश भेजने से पहले respondsToSelector:self.delegate पर भेजना चाहता हूं, लेकिन यह संकलित नहीं होता है। असफल संदेश है:self.delegate प्रतिसाद देता है चयनकर्ता: ...

चयनकर्ता 'प्रतिसाद' चयनकर्ता ' के लिए कोई ज्ञात उदाहरण विधि नहीं है।

एक काम के आसपास, मैं "स्वच्छ" प्रतिनिधि के रूप में नीचे दिखाया गया है, जो संकलित रूप में ...

//MyClass.h: 

@class MyClass; 

@Protocol MyClassDelegate 
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; 
@end 

@interface MyClass : UIViewController 

@property (nonatomic, weak) id<MyClassDelegate> delegate; 

@end 

और

//MyClass.m: 

... 
@synthesize delegate = _delegate; 
... 

id sanitizedDelegate = self.delegate; //Hmmmm... why does this work? 

if ([sanitizedDelegate respondsToSelector:@selector(myClass:willDoSomething:)]) { 
    [self.delegate myClass:self willDoSomething:animated]; 
} 

मैंने this one सहित कई पदों की जांच की लेकिन यह संकलन विफल समस्या का उत्तर नहीं देता है।

इसके अलावा, विकल्प accessors काम नहीं करते ...

[self delegate] 
//or 
_delegate 

किसी को भी इस देखा है या से निपटने में एक बेहतर तरीका सलाह दे सकते हैं?

आईओएस 5.0: (9A334), Xcode 4.2.1 (4D502)

उत्तर

95

-respondsToSelector: NSObject पर एक विधि है। या तो मानते हैं कि आपकी id प्रतिनिधि एक NSObject वास्तव में है, और डाली यह:

[(NSObject*)self.delegate respondsToSelector:@selector(myClass:willDoSomething:)]

या, बेहतर, आपका प्रतिनिधि स्पष्ट रूप से एक NSObject बनाने:

@property (nonatomic, weak) NSObject<MyClassDelegate>* delegate;

या प्रोटोकॉल हो कर NSObject का उप-प्रोटोकॉल:

@protocol MyClassDelegate <NSObject>

+10

का-चिंग ... मैं दरवाजा # 3 ले जाऊंगा। – vmanjz

+0

प्रतिनिधियों को एनएसओब्जेक्ट के रूप में घोषित करने के लिए काम किया, धन्यवाद! – c0d3Junk13

14

मूल रूप से आप कह रहे हैं कि आपका प्रतिनिधि तो संकलक मानता है कि उन लोगों के केवल तरीके उपलब्ध हैं अपने <MyClassDelegate> प्रोटोकॉल द्वारा केवल विवश है।

@Protocol MyClassDelegate <NSObject> 
- (void)myClass:(MyClass *)sender willDoSomething:(BOOL)animated; 
@end 

इस तरह संकलक जानता है कि किसी भी वस्तु जो अपने प्रोटोकॉल के अनुरूप भी <NSObject> प्रोटोकॉल जो respondsToSelector: को परिभाषित करता है के अनुरूप है: क्या आप क्या करने की जरूरत प्रोटोकॉल इसलिए की तरह का विस्तार <NSObject> है।

+1

हां, कोड समापन वही सलाह देता है ... अब से मानक अभ्यास। – vmanjz

संबंधित मुद्दे