it-swarm.com.de

So erstellen Sie ein "Array von Selektoren"

Ich verwende das iPhone SDK (3.0) und versuche, ein Array von Selektoren zu erstellen , um verschiedene Methoden innerhalb einer Klasse aufzurufen.

Offensichtlich mache ich etwas falsch (ich denke, @selector wird nicht als Klasse betrachtet und es funktioniert also nicht, sie in einen NSArray zu stopfen).

Ich habe es versucht, aber es ist offensichtlich falsch. 

Gibt es eine einfache Möglichkeit, ein derartiges Array von Selektoren zu haben? Oder gibt es eine bessere Möglichkeit, eine Sammlung von Methoden zu durchlaufen?

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

Könnten Sie Strings speichern und NSSelectorFromString verwenden? 

Aus den Dokumenten

NSSelectorFromString

Gibt den Selektor mit einem gegebenen Namen zurück.

SEL NSSelectorFromString (
   NSString *aSelectorName
);
79
blindjesse

Dadurch wird ein Objekt aus dem Selektor erstellt: 

[NSValue valueWithPointer:@selector(x)]
40
DenNukem

Warum nicht einfach ein einfaches C-Array verwenden?

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

...

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

Sie können auch ein Array von NSInvocations erstellen. Dies ist praktisch, wenn Sie ein Argument für Ihren Selector benötigen.

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
12
Morrowless

Wenn die Liste statisch ist, würde ich auf die Lösung von KennyTM zurückgreifen. Wenn Sie jedoch ein dynamisches Array oder einen dynamischen Satz benötigen, können Sie neben dem Speichern der Auswahlzeichenfolge ein Objekt mit der Eigenschaft SEL oder ivar erstellen und speichern.

@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

Anschließend können Sie der Klasse auch eine perform-Methode hinzufügen und dort den Methodenaufruf implementieren.

1
big_m

NSPointerArray ist das, was du willst, denke ich. SEL ist ein undurchsichtiges Objekt, wie Apple doc sagte

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

Ich denke, Mutabilität ist sehr nützlich. Ein Array im C-Stil ist nicht veränderbar, außer dass Sie malloc/free verwenden.

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

ist einfach, aber nicht flexibel. Wählen Sie, wie Sie möchten.

0
DawnSong