2011-06-30 14 views
6

का उपयोग करके ऑब्जेक्ट को संदेश भेजना निम्नलिखित respondsToSelector परीक्षण पास करेगा, लेकिन या [viewController action:selector] पर वास्तविक कॉल पर SIGABRT होगा। स्टैक ट्रेस राज्यों 'एनएसआईएनवालिडअर्ग्यूमेंट अपवाद, कारण: - [MyViewController चयनकर्ता]: अपरिचित चयनकर्ता'।चयनकर्ता और NSSelectorFromString

[viewController @selector(selector)] संकलन त्रुटि (त्रुटि: अपेक्षित ':' चयनकर्ता 'से पहले) का कारण बन जाएगा।

जब चयनकर्ता हार्ड कोड किया जाता है, तो सभी अच्छी तरह से काम करते हैं।

मैं किसी ऑब्जेक्ट को किसी चयनकर्ता के माध्यम से संदेश कैसे भेजूं?

-(void) notifyViewControllers:(NSString*) message 
{ 
    if(!message) return; 

    SEL selector = NSSelectorFromString(message); 
    if(!selector) return; 

    NSArray* viewControllers = [self.tabBarController viewControllers]; 
    if(!viewControllers) return; 

    for (UIViewController* viewController in viewControllers) 
    { 
     if(!viewController) continue; 

     if ([viewController respondsToSelector:selector]) { 
      // [viewController selector]; 
      [viewController action:selector]; 
     } 
    } 
} 

उत्तर

10
[self performSelector:@selector(notifyViewControllers:) withObject: message]; 
4

[viewController performSelector:selector]; 

इसके अलावा performSelector 'परिवार' में NSObject अन्य तरीकों की जाँच की कोशिश करो - उन लोगों के साथ आप आसानी से देरी से और/या पृष्ठभूमि धागे पर चयनकर्ता कॉल कर सकते हैं।

+0

धन्यवाद व्लादिमीर। राकेश ने आपको हराया (प्रदर्शन चयनकर्ता) - लेकिन आपका बिल्कुल सही था। – jww

2

पता करने के लिए ऐसा करने के तरीके जहां performSelector उपयोग नहीं कर सकते, हो सकता है क्योंकि चयनकर्ता स्ट्रिंग एक प्रोटोकॉल विधि भीतर किया जाना चाहिए उपयोगी हो सकता है:

आदेश में चयनकर्ता मापदंडों समर्थन अनुमति देने के लिए, यह होना चाहिए इस प्रकार निर्दिष्ट किया:

NSString *stringForSelector = @"doSomethingAwesome:"; // notice the colon 

मान लीजिए कि हम एक टैप जेस्चर

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:NSSelectorFromString(stringForSelector)]; 
को संभालने के लिए जा रहे हैं

UIGestureRecognizer वर्ग कार्रवाई कॉलबैक में पहचानकर्ता ही उपयोग करने की अनुमति:

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer; 

तो कुछ टैप करने पर भयानक करने के लिए, हम लिख सकते हैं:

- (void)doSomethingAwesome:(UITapGestureRecognizer *)tapGesture 
{ 
    // gesture handling with UIGestureRecognizer availability 
} 
संबंधित मुद्दे