2010-02-09 17 views
80

iPhone SDK (3.0) kullanıyorum ve bir sınıf içinde çeşitli yöntemleri çağırmak için seçiciler dizisi oluşturmaya çalışıyorum."seçiciler dizisi" nasıl oluşturulur

Açıkçası, yanlış bir şey yapıyorum (sanırım @selector bir sınıf olarak görülmüyor ve NSArray'a doldurulmuyor).

Bunu denedim, ama belli ki yanlış.

Böyle bir dizi seçiciye sahip olmanın basit bir yolu var mı? Ya da bir yöntem koleksiyonu ile yinelemek için daha iyi bir yolu var mı?

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; 
} 

cevap

79

ipleri depolamak ve NSSelectorFromString kullanabilir misiniz? docs

NSSelectorFromString 

itibaren

verilen isimdeki seçici döndürür.

SEL NSSelectorFromString (
    NSString *aSelectorName 
); 
+0

bana iyi geliyor. Teşekkürler! – user141146

+0

Sadece bir dizi seçici gerektiğinde uygun bir çözüm değildir. –

40

Bu seçicinin dışına bir nesne oluşturur:

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

Seçiciyi "performSelector:" tarafından kullanılacak şekilde nasıl ayırırsınız? –

+3

@DeanKelly, http://stackoverflow.com/questions/575055/how-to-build-a-nsarray-or-nsmutablearray-of-class-methods-in-objective-c tarafından terry franguiadakis –

+0

Type cast gerekli aşağıdaki gibi, 'SEL x = (SEL) selectorValue.pointerValue;' –

34

Neden sadece basit bir C dizi kullanabilir?

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

... 

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

İyi, ama 'statik 'burada gerekli değildir (başlatıcı bir derleme zamanı sabiti değil). –

+0

Bu cevap daha fazla oy gerekiyor! –

12

Ayrıca bir dizi NSInvocation s oluşturabilirsiniz. Bu, seçicinize gitmek için bir argümana ihtiyacınız varsa kullanışlıdır.

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

NSInvocation çok pahalı. –

1

liste statik ise, ben KennyTM solüsyonu ile gitmek istiyorum ama seçici dizesini depolamak yanında dinamik bir dizi veya dizi başka bir seçenek, gerekirse, bir SEL özelliği olan bir nesne oluşturmak için veya Ivar ve sakla.

@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 

Ardından yanı sınıfa bir perform yöntemi ekleyin ve orada yöntem çağrısı uygulamak.

İlgili konular