2011-12-05 17 views
12

के लिए कोई ज्ञात इंस्टेंस विधि नहीं है, मुझे अपनी कक्षा डीबग करने में सहायता चाहिए। मुझे एक त्रुटि इतनी विचित्र हो रही है कि मुझे कुछ भी समान नहीं मिला, इसलिए मैं बस अपना अधिकांश कोड डालने जा रहा हूं।एक्सकोड त्रुटि: चयनकर्ता

//Tab.h 
#import <UIKit/UIKit.h> 
@class Tab; 
@protocol TabDelegateDataSource <NSObject> 
@required 
-(void)removeTab:(Tab *)tab; 
@end 

@interface Tab : UIView 
{ 
    id <TabDelegateDataSource> __strong _delegate; 
} 

@property(strong) id <TabDelegateDataSource> delegate; 

-(void)removeTab; 

@end 

// Tab.m 
#import "Tab.h" 
@implementation Tab 
@synthesize delegate = _delegate; 
-(void)removeTab 
{ 
    [self.delegate removeTab:self];//Error here saying: No known instance method for selector 'removeTab:' 
} 

@end 
+1

जिज्ञासा से बाहर, क्या अगर आप अपमानजनक रेखा पर '_delegate' के साथ 'self.delegate' को प्रतिस्थापित करते हैं तो क्या होगा? – dasblinkenlight

+0

क्या आपके प्रतिनिधि के पास वास्तव में 'removeTab' विधि है? यह त्रुटि संदेश यह दर्शाता है कि यह नहीं करता है। डीबगिंग और स्वयं का निरीक्षण करने का प्रयास करें। डिलीगेट करें, और सुनिश्चित करें कि आप यही उम्मीद करते हैं, और इसमें 'removeTab' विधि है। – WilHall

+1

समस्या आपके द्वारा पोस्ट किए गए कोड में नहीं है। मैंने इसे एक नई परियोजना में कॉपी किया और यह त्रुटियों और चेतावनियों के बिना संकलित करता है –

उत्तर

5

मुझे लगता है कि यह मैं एप्लिकेशन बार के एक जोड़े को पुनः आरंभ Xcode के साथ एक बेवकूफ समस्या थी और इसे बाहर काम कर समाप्त हो गया।

+0

मैं इस जवाब को काम नहीं कर सकता लेकिन मेरी समस्या हल करने के लिए एक्सकोड को पुनरारंभ करें। धन्यवाद भाई। – PhatHV

4

आप हमेशा अपने प्रतिनिधि इस तरह, एक विधि कॉल करने से पहले, यहाँ तक कि आवश्यक प्रोटोकॉल तरीकों के साथ की जाँच करनी चाहिए:

if(self.delegate != nil && [ self.delegate respondsToSelector: @selector(removeTab:) ] 
{ 
    /* Call delegate method... */ 
} 

भी आवश्यक तरीकों के लिए ऐसा करने से एक अतिरिक्त सुरक्षा कहते हैं, के रूप में यह चेक है रनटाइम पर बनाया गया।
कोई व्यक्ति संकलक चेतावनियों को अनदेखा या अक्षम कर सकता है, या टाइप-कास्ट के साथ कंपाइलर को मूर्ख बना सकता है।

उदाहरण के लिए:

UILabel * label  = [ [ UILabel alloc ] initWithFrame: CGRectZero ]; 
someTableView.delegate = (id <UITableViewDelegate>)label; 

इसके अलावा, आप वास्तविक विधि कॉल के लिए performSelector उपयोग कर सकते हैं: delegateForTab की तरह दूसरों के लिए delegate नाम बदलने के लिए

[ self.delegate performSelector: @selector(removeTab:) withObject: self ]; 
+6

के साथ करना है, मुझे नहीं लगता कि यह प्रोटोकॉल में आवश्यक विधियों के लिए क्यों आवश्यक होना चाहिए। यदि आवश्यक विधि लागू नहीं की जाती है तो संकलक चेतावनी दिखाएगा। –

+1

@Macmade विधि कॉल पर 'प्रदर्शन चयनकर्ता' को प्राथमिकता देने के लिए तर्कसंगत क्या है? – zaph

+0

@fluchtpunkt यह एक अतिरिक्त सुरक्षा है, इसलिए आप संकलक सेटिंग्स पर भरोसा नहीं करते हैं। मेरा संपादन देखें, जो रनटाइम चेक के कारण की व्याख्या करता है। – Macmade

1

प्रयास करें।

आपका वर्ग TabUIView उपवर्गीकरण है, इसलिए self.delegate के self वर्ग भी UIView का एक उपवर्ग है। UIView का अपना प्रतिनिधि हो सकता है (यह यूआईआरस्पॉन्डर से प्राप्त होता है, और एनएसओब्जेक्ट से गहरा होता है), और इसमें -(void)removeTab विधि नहीं है। बस मेरा व्यक्तिगत अनुमान है।
मेरे समाधान नाम बदलने यह (चाहे वह subclassed किया जा सकता है या तो अभी तक उत्तर नहीं मिल) है। प्रतिनिधि प्रयोग करने के लिए

सुझाव: आप को लागू करने और अन्य दृश्य नियंत्रकों में delegate उपयोग करते हैं, एक ही कक्षा है कि आप इसे की घोषणा में नहीं करना चाहिए। :)

+0

अच्छा अभ्यास, लेकिन UIView में कोई प्रतिनिधि नहीं है। तो यह दुर्भाग्य से मदद नहीं करेगा ...:) – Macmade

+0

@Macmade, आपकी सलाह के लिए धन्यवाद!मैंने पहले इस मुद्दे से मुलाकात की है: मैंने एक वर्ग बनाया है जो यूआईनेविगेशन नियंत्रक से प्राप्त होता है, जिसके परिणामस्वरूप एक ही त्रुटि होती है, और मैंने इसे 'प्रतिनिधि' का नाम बदलकर हल किया। अभी, मैं एसडीके का उल्लेख करता हूं, यूआईवीव के पास इसका प्रतिनिधि नहीं है, यह सही है। :) हालांकि, यह 'यूरीस्पॉन्डर' से प्राप्त होता है, और 'NSObject' से गहरा होता है। 'NSObject' का प्रोटोकॉल और प्रतिनिधि है। तो मुझे लगता है कि '[self.delegate removeTab: self];' 's' self' सिर्फ एक NSObject है। मुझे यकीन नहीं है कि यह एक सही कारण है या नहीं। बस मेरा व्यक्तिगत अनुमान है। : पी – Kjuly

0

यह त्रुटि एक संकलक त्रुटि नहीं है, है ना? क्योंकि मेरे पास आपके कोड के साथ कोई कंपाइलर त्रुटियां नहीं हैं।

तो अगर यह एक रनटाइम त्रुटि है, तो आप इस तरह अपने प्रतिनिधि कक्षाओं में <TabDelegateDataSource> घोषित किया है:

@interface SomeClass : UIView <TabDelegateDataSource>

आप वैसा ही किया, तो संकलक आप अगर अपने उदाहरण विधि नहीं कर सकते चेतावनी किया जाना चाहिए पाया जायेगा।

या शायद आपको अधिक जानकारी के लिए अपने प्रतिनिधि वर्ग का कोड भी पोस्ट करना चाहिए।

पीएस प्रतिनिधि __strong नहीं होना चाहिए। आप इसके बजाय __unsafe_unretained का बेहतर उपयोग करेंगे।

14

अब मैं इस त्रुटि को फिर से बना और ठीक कर सकता हूं।

सुनिश्चित करें कि ज हैडर जहां इस परिभाषित किया गया है ...

@protocol TabDelegateDataSource <NSObject> 
-(void)removeTab:(Tab *)tab; 
@end 

...को शामिल किया गया है जहां भी आप प्रतिनिधि का उपयोग करने की योजना बना रहे हैं, उदा। कहीं है कि इस में शामिल हैं मीटर स्रोत के शीर्ष पर:

[self.delegate removeTab:self] 

संकलक केवल इस तरह TabDelegateDataSource के आगे परिभाषा देखा है, तब:

@protocol TabDelegateDataSource; 

आपको त्रुटि मिल जाएगा:

error: no known instance method for selector 'removeTab:' 

और न अधिक की उम्मीद आगे परिभाषा संबंधित त्रुटि

+1

यह मेरी समस्या थी। मैं इस .h फ़ाइल में अपने प्रोटोकॉल के लिए हेडर आयात नहीं कर रहा था। धन्यवाद महोदय ! –

0

मैं अपने appdelegate.h और त्रुटि का समाधान आयात ...

2

सुनिश्चित करें कि आप गलत तरीके से इंटरफ़ेस में प्रतिनिधि संपत्ति घोषित नहीं किया है (शायद कॉपी करने और किसी अन्य फ़ाइल से चिपकाने के द्वारा)। उदाहरण के लिए:

@protocol SomeDelegate 

... 

@end 

@interface SomeClass 

... 

@property (nonatomic, retain) id<DifferentDelegate>delegate; 


@end 

ऊपर लाइन indtended प्रोटोकॉल, शायद एक कॉपी और पेस्ट त्रुटि के साथ बेमेल की वजह से "चयनकर्ता के लिए कोई ज्ञात उदाहरण विधि ..." का कारण होगा। इसके अलावा, यह एक अलग वर्ग से सही संदर्भ को ओवरराइड करने की संभावना है जहां यह वास्तव में संबंधित है, कोड की इस पंक्ति से बहुत दूर है, जिससे इसे स्थानांतरित करना मुश्किल हो जाता है।

सही इरादा प्रोटोकॉल के साथ अपनी संपत्ति की घोषणा से ऊपर:,

@property (nonatomic, retain) id<SomeDelegate>delegate; 
+0

प्रतिनिधियों को हमेशा कमजोर होना चाहिए (कभी भी बनाए/मजबूत नहीं) – SamB

0

किसी की जरूरत हो सकती है

SEL selector = NSSelectorFromString(@"removeTab"); 

if([self.delegate respondsToSelector:selector]) { 
    objc_msgSend(self.delegate, selector); 
} 

नोट: इस मत भूलना, #import <objc/message.h>

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