Bir "seçici dizisi" nasıl oluşturulur?


82

İPhone SDK (3.0) kullanıyorum ve bir sınıf içinde çeşitli yöntemleri çağırmak için bir dizi seçici oluşturmaya çalışıyorum .

Açıkçası, yanlış bir şey yapıyorum (@selector'ın bir sınıf olarak kabul edilmediğini ve bu yüzden onları bir NSArray'e doldurmanın işe yaramadığını düşünüyorum).

Bunu denedim ama açıkça yanlış.

Bunun gibi bir dizi seçiciye sahip olmanın basit bir yolu var mı? Ya da bir dizi yöntem aracılığıyla yinelemenin 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;
}

Yanıtlar:


79

Dizeleri depolayabilir ve NSSelectorFromString'i kullanabilir misiniz?

Gönderen docs

NSSelectorFromString

Seçiciyi belirli bir adla döndürür.

SEL NSSelectorFromString (
   NSString *aSelectorName
);

2
Yalnızca bir dizi seçiciye ihtiyaç duyulduğunda uygun bir çözüm değildir.
Aleks N.

1
NSPointerArraydaha iyi.
DawnSong


35

Neden basit bir C dizisi kullanmıyorsunuz?

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, ancak staticburada gerekli değil (başlatıcı bir derleme zamanı sabiti değildir).
Aleks N.

12

Ayrıca bir dizi de oluşturabilirsiniz NSInvocation. Seçicinizle birlikte bir tartışmaya ihtiyacınız varsa bu 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

NSInvocation çok pahalı.
DawnSong

1

Liste statikse, KennyTM'nin çözümünü tercih ederim, ancak dinamik bir diziye veya kümeye ihtiyacınız varsa, seçici dizeyi depolamanın yanı sıra başka bir seçenek, bir SELözellik veya ivar ile bir nesne oluşturmak ve bunu saklamaktır.

@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

Daha sonra performsınıfa bir yöntem ekleyebilir ve burada yöntem çağrısını uygulayabilirsiniz.


1

Bir dizide seçicileri depolamak için iki yöntemi tamamlamak istiyorum,

İlk NSPointerArrayolarak SEL, Apple doc'un dediği gibi opak işaretçiyi depolayabilir ,

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

İkincisi, C tarzı dizi çok daha basittir,

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

Dilediğinizi seçin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.