2011-08-31 6 views
5

मेरे पास एक छोटा सा कन्डर्रम है जो मुझे दीवार पर सीधे चला रहा है। मैं एक आवेदन में एक पैटर्न के रूप में बहुत अधिक प्रतिनिधिमंडल का उपयोग कर रहा हूं जो मैं लिख रहा हूं। मैं प्रतिनिधियों को कॉल करने वाले कोड में "सावधान" होने की कोशिश कर रहा हूं क्योंकि मैं प्रत्येक प्रतिनिधि कॉल पर "[प्रतिनिधि जवाब देने के लिए चयनकर्ता]" के साथ प्रतिनिधि का परीक्षण कर सकता हूं। सब कुछ ठीक काम करता है जब तक कि मैं UIView उपclass में नहीं हूं। उस स्थिति में, जवाब देने के लिए चयनकर्ता अभी तक वापस नहीं लौटाता है, फिर भी मैं प्रतिनिधि कोड को सुरक्षित रूप से कॉल कर सकता हूं, इसलिए यह स्पष्ट रूप से मौजूद है और सही तरीके से काम करता है।इस मामले में जवाब देने के लिए मेरा चयन क्यों नहीं करता है?

मैंने इसे नीचे दिए गए सबसे सरल उदाहरण में उबाला है। किसी भी मदद प्रदान कर सकते हैं की सराहना की जाएगी:

मेरी UIView उपवर्ग के ज फ़ाइल के अंदर

:

#import <UIKit/UIKit.h> 

@protocol TestDelegate <NSObject> 
@optional 
-(double)GetLineWidth; 
@end 

@interface ViewSubclass : UIView { 
    id<TestDelegate> delegate; 
} 

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

@end 

मेरी प्रतिनिधि वर्ग के ज फ़ाइल के अंदर:

#import <Foundation/Foundation.h> 
#import "ViewSubclass.h" 

@interface ViewDelegate : NSObject <TestDelegate> { 

} 

@end 

मेरी प्रतिनिधि वर्ग के मीटर के अंदर फ़ाइल:

#import "ViewDelegate.h" 

@implementation ViewDelegate 

-(double)GetLineWidth { 
    return 25.0; 
} 

@end 

मेरी UIView उपवर्ग के मीटर फ़ाइल के अंदर:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    double lineWidth = 2.0; 

    if (delegate == nil) { 
     ViewDelegate *vd = [[ViewDelegate alloc]init]; 
     delegate = vd; 
    } 

    // If I comment out the "if" statement and just call the delegate 
    // delegate directly, the call works! 
    if ([delegate respondsToSelector:@selector(GetLineWidth:)]) { 
     lineWidth = [delegate GetLineWidth]; 
    } 

    CGContextSetLineWidth(context, lineWidth); 
+0

आमतौर पर आप प्रतिनिधियों '@property बनाए रखने के लिए नहीं चाहते हैं (nonatomic, आवंटित) आईडी प्रतिनिधि;' – slf

+1

क्या रोब ने कहा ; उस विधि को 'लाइनविड्थ' कहा जाना चाहिए। विधियों को कभी भी अपरकेस अक्षरों से शुरू नहीं करना चाहिए और केवल दुर्लभ परिस्थितियों में 'get' से शुरू होना चाहिए। यह एक स्टाइल पसंद नहीं है, यह एक पैटर्न है जिसे आपको फ्रेमवर्क की सभी सुविधाओं के लिए सही ढंग से काम करने के लिए पालन करना होगा। – bbum

उत्तर

14

-(double)GetLineWidth के लिए चयनकर्ता @selector(GetLineWidth) है।

आपके पास अपने चयनकर्ता में एक अतिरिक्त कॉलन है।

if ([delegate respondsToSelector:@selector(GetLineWidth:)]) { 
                ^
+0

ठीक है, आप पहले थे =) – Nekto

+5

और 'GetLineWidth' को 'lineWidth' नाम दें। "गेट" के साथ एक्सेसर्स को वरीयता न दें और अग्रणी कैप से शुरू न करें। यह कोको में महत्वपूर्ण है, यह सिर्फ एक स्टाइल पसंद नहीं है। –

+0

दोह! सबको धन्यवाद! – user704315

3

बदलें अगर बयान इस एक के साथ:

if ([delegate respondsToSelector:@selector(GetLineWidth)]) { 
    lineWidth = [delegate GetLineWidth]; 
} 
संबंधित मुद्दे