2010-02-09 12 views
80

मैं आईफोन एसडीके (3.0) का उपयोग कर रहा हूं और मैं एक वर्ग के भीतर विभिन्न विधियों का आह्वान करने के लिए चयनकर्ताओं की सरणी बनाने की कोशिश कर रहा हूं।"चयनकर्ताओं की सरणी" कैसे बनाएं

जाहिर है, मैं कुछ गलत कर रहा हूं (मुझे लगता है कि @ चयनकर्ता को कक्षा नहीं माना जाता है और इसलिए उन्हें एनएसएआरएआरई में भरना काम नहीं कर रहा है)।

मैंने कोशिश की, लेकिन यह स्पष्ट रूप से गलत है।

क्या इस तरह के चयनकर्ताओं की एक सरणी रखने का कोई आसान तरीका है? या विधियों के संग्रह के माध्यम से पुन: प्रयास करने का एक बेहतर तरीका है?

selectors = [NSArray arrayWithObjects: 
          @selector(method1), 
          @selector(method2), 
          @selector(method3), 
          @selector(method4), 
          @selector(method5), 
          @selector(method6), 
          @selector(method7), nil]; 

for (int i = 0; i < [selectors count]; i++) { 
    if ([self performSelector:[selectors objectAtIndex:i]]) // do stuff; 
} 

उत्तर

79

आप तार की दुकान और NSSelectorFromString का उपयोग कर सकते हैं?

docs

NSSelectorFromString 

से किसी दिए गए नाम के साथ चयनकर्ता देता है।

SEL NSSelectorFromString (
    NSString *aSelectorName 
); 
+0

मेरे लिए अच्छा लगता है। धन्यवाद! – user141146

+0

जब चयनकर्ताओं की एक सरणी की आवश्यकता होती है तो उचित समाधान नहीं है। –

40

इस चयनकर्ता से बाहर एक वस्तु बनाता है:

[NSValue valueWithPointer:@selector(x)] 
+2

'प्रदर्शनकर्ता:' द्वारा उपयोग किए जाने के लिए आप चयनकर्ता को निकालने के बारे में कैसे जाएंगे? –

+3

@DeanKelly ने उत्तर दिया http://stackoverflow.com/questions/575055/how-to-build-a-nsarray-or-nsmutablearray-of-class-methods-in-objective-c टेरी franguiadakis द्वारा –

+0

टाइप कास्ट की आवश्यकता है , जैसा कि निम्नानुसार है, 'एसईएल एक्स = (एसईएल) चयनकर्ता वैल्यू पॉइंटर वैल्यू; ' –

34

क्यों नहीं बस एक साधारण सी सरणी का उपयोग करें?

static const SEL selectors[] = {@selector(method1), 
           .... 
           @selector(method7)}; 

... 

for (int i = 0; i < sizeof(selectors)/sizeof(selectors[0]); i++) { 
    [self performSelector:selectors[i]]; 
    // .... 
} 
+3

अच्छा, लेकिन' स्थिर 'की आवश्यकता नहीं है (प्रारंभकर्ता एक संकलन-समय स्थिर नहीं है)। –

+0

इस उत्तर के लिए अधिक वोट की आवश्यकता है! –

12

आप NSInvocation एस की एक सरणी भी बना सकते हैं। यदि आपको अपने चयनकर्ता के साथ जाने के लिए तर्क की आवश्यकता है तो यह आसान है।

NSMethodSignature *sig = [[yourTarget class] instanceMethodSignatureForSelector:yourSEL]; 
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig]; 
[inv setTarget:yourTarget]; 
[inv setSelector:yourSEL]; 
[inv setArgument:&yourObject atIndex:2]; // Address of your object 
+0

एनएसआईएनवोकेशन बहुत महंगा है। –

1

तो सूची स्थिर है, मैं KennyTM समाधान के साथ जाना चाहते हैं, लेकिन अगर आप एक गतिशील सरणी या सेट, एक और विकल्प, चयनकर्ता स्ट्रिंग भंडारण के अलावा जरूरत है, एक SEL संपत्ति के साथ एक वस्तु बनाने के लिए है या इवर, और स्टोर है कि।

@interface SelectorObject : NSObject 
@property (assign, readonly, nonatomic) SEL selector; 
- (id)initWithSelector:(SEL)selector; 
@end 

@implementation SelectorObject 
- (id)initWithSelector:(SEL)selector { 
    self = [super init]; 
    if (self) { 
    _selector = selector; 
    } 
    return self; 
} 
@end 

फिर आप के साथ-साथ वर्ग के लिए एक perform विधि जोड़ने, और वहाँ विधि कॉल को लागू कर सकते हैं।

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