कैसे "चयनकर्ताओं की एक सरणी" बनाने के लिए


82

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

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

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

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

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 का उपयोग कर सकते हैं?

से डॉक्स

NSSelectorFromString

चयनकर्ता को दिए गए नाम के साथ लौटाता है।

SEL NSSelectorFromString (
   NSString *aSelectorName
);

2
चयनकर्ताओं की एक सरणी की आवश्यकता होने पर उचित समाधान नहीं।
एलेक्स एन।

1
NSPointerArrayबेहतर है।
डॉनसॉन्ग '

43

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

[NSValue valueWithPointer:@selector(x)]

2
आप इसका उपयोग करने के लिए चयनकर्ता को निकालने के बारे में कैसे जाएंगे performSelector:?
डीन केली

3
@DeanKelly ने यहां जवाब दिया stackoverflow.com/questions/575055/… टेरी फ्रेंगुइडाकिस द्वारा
ABCD.ca

1
टाइप कास्ट की जरूरत है, इस प्रकार है,SEL x = (SEL)selectorValue.pointerValue;
डॉनसॉन्ग

35

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

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

...

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

3
अच्छा है, लेकिन staticयहां इसकी जरूरत नहीं है (शुरुआती समय में संकलन नहीं है)।
एलेक्स एन।

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

NSInvocation बहुत महंगा है।
डॉनसॉन्ग

1

यदि सूची स्थिर है, तो मैं केनीटीएम के समाधान के साथ जाऊंगा, लेकिन अगर आपको डायनेमिक ऐरे या सेट की जरूरत है, तो चयनकर्ता स्ट्रिंग को स्टोर करने के अलावा एक अन्य विकल्प, एक 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कक्षा में भी एक विधि जोड़ सकते हैं , और वहां विधि कॉल को लागू कर सकते हैं।


1

मैं एक सरणी में चयनकर्ताओं को संग्रहीत करने के दो तरीकों को पूरक करना चाहता हूं,

सबसे पहले, NSPointerArrayअपारदर्शी पॉइंटर को स्टोर कर सकते हैं, जैसे SELकि Apple doc ने कहा,

NSPointerArray *selectors = [[NSPointerArray alloc] initWithOptions: NSPointerFunctionsOpaqueMemory];
[selectors addPointer:@selector(onSendButton:)];
[button addTarget: self action:[selectors pointerAt:0] forControlEvents:UIControlEventTouchUpInside];

दूसरा, सी-स्टाइल ऐरे ज्यादा सरल है,

SEL selectors[] = { @selector(onSendButton:) };
[button addTarget: self action:selectors[0] forControlEvents:UIControlEventTouchUpInside];

अपनी इच्छानुसार कोई भी चुनें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.