2011-10-29 14 views
27

के रूप में कैसे आप किसी अन्य विधि के लिए एक पैरामीटर के रूप में एक विधि पारित करते हैं? मैं कक्षाओं में यह कर रहा हूँ।ऑब्जेक्टिव-सी गुजर तरीकों पैरामीटर

क्लास ए:

+ (void)theBigFunction:(?)func{ 
    // run the func here 
} 

कक्षा बी:

- (void)littleBFunction { 
    NSLog(@"classB little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:littleBFunction] 

कक्षा सी:

- (void)littleCFunction { 
    NSLog(@"classC little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:littleCFunction] 
+1

आप चयनकर्ता पास करते हैं एस, यहां एक समान प्रश्न है: http://stackoverflow.com/questions/519600/is-it-possible-to-pass-a-method-as-an-argument-in-objective-c – utahwithak

उत्तर

43

प्रकार आप देख रहे हैं चयनकर्ता (SEL) है और आप प्राप्त एक विधि के इस तरह चयनकर्ता:

SEL littleSelector = @selector(littleMethod); 

विधि पैरामीटर लेता है, तो आप बस : डाल जहाँ वे जाते हैं, इस तरह:

SEL littleSelector = @selector(littleMethodWithSomething:andSomethingElse:); 

इसके अलावा, तरीकों वास्तव में नहीं कर रहे हैं काम करता है, वे जब से शुरू होने वाले विशिष्ट वर्ग (करने के लिए संदेश भेजने के लिए उपयोग किया जाता है +) या इसका विशिष्ट उदाहरण (जब से शुरू होता है)। कार्य सी-प्रकार हैं जिनके पास वास्तव में "लक्ष्य" जैसी विधियां नहीं होती हैं।

[target performSelector:someSelector]; 

इस का एक अच्छा उदाहरण है UIControl के addTarget:action:forControlEvents: विधि आप आमतौर पर जब बनाने का उपयोग करें:

एक बार जब आप एक चयनकर्ता मिलता है, तो आप अपने लक्ष्य पर कि विधि कॉल इस तरह (यह वर्ग या उदाहरण हो) UIButton या कुछ अन्य नियंत्रण वस्तुओं प्रोग्राम के रूप में।

+0

आप जानते हैं एक बार जब यह पारित हो जाता है तो मैं फ़ंक्शन को कैसे कॉल करूं? मैं * शक * [आत्म func] काम करेगा। – Jacksonkr

+3

[लक्ष्य प्रदर्शन चयनकर्ता: कुछ चयनकर्ता]; –

7

एक अन्य विकल्प ब्लॉकों को देखने के लिए है। यह आपको कोड के ब्लॉक (एक बंद) को पास करने की अनुमति देता है।

यहाँ एक अच्छा लिखने निर्भर है ब्लॉक पर:

http://pragmaticstudio.com/blog/2010/7/28/ios4-blocks-1

यहाँ सेब डॉक्स है:

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html

7

उद्देश्य सी इस आपरेशन अपेक्षाकृत आसान बना देता है। ऐप्पल this documentation प्रदान करता है।

सीधे आपके प्रश्न को हल करने के लिए, आप एक समारोह है, लेकिन एक चयनकर्ता बुला नहीं कर रहे हैं।यहां कुछ नमूना कोड है:

बिग फंक्शन:

+ (void)theBigFunction:(SEL)func fromObject:(id) object{ 
    [object preformSelector:func] 
} 
फिर कक्षा बी के लिए

:

- (void)littleBFunction { 
    NSLog(@"classB little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:@selector(littleBFunction) fromObject:self] 

फिर कक्षा के लिए C:

- (void)littleCFunction { 
    NSLog(@"classC little function"); 
} 

// somewhere else in the class 
[ClassA theBigFunction:@selector(littleCFunction) fromObject:self] 

संपादित करें: ठीक भेजा चयनकर्ताओं (अर्धविराम को हटाएं)

+0

आपके चयनकर्ता विधि विवरण से मेल नहीं खाते हैं, उनके अंत में कोई भी '' 'नहीं होना चाहिए। –

+0

ओह, इसके बारे में क्षमा करें। मैं एक उद्देश्य सी कोडर नहीं हूं (मैंने केवल इसमें डब किया है) और मैंने ऐप्पल के उदाहरणों का बहुत करीब से पालन किया! – MJD

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