83 votes

Comment créer un « tableau de sélecteurs »

Je suis en utilisant le SDK de l'iPhone (3.0) et je suis en train de créer un tableau de sélecteurs d'invoquer une variété de méthodes dans une classe.

Évidemment, je suis en train de faire quelque chose de mal (je pense que @sélecteur n'est pas considérée comme une classe, et donc de leur farce dans un NSArray ne fonctionne pas).

J'ai essayé, mais c'est évidemment faux.

Est-il un moyen simple de disposer d'un tableau de sélecteurs de ce genre? Ou est-il une meilleure façon de faire une itération sur une collection de méthodes?

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

79voto

blindJesse Points 2059

Pourriez-vous stocker des chaînes et utiliser NSSelectorFromString?

De la docs

 NSSelectorFromString
 

Retourne le sélecteur avec un nom donné.

 SEL NSSelectorFromString (
   NSString *aSelectorName
);
 

44voto

DenNukem Points 3455

Cela crée un objet en dehors du sélecteur:

 [NSValue valueWithPointer:@selector(x)]
 

37voto

KennyTM Points 232647

Pourquoi ne pas simplement utiliser un tableau C simple?

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

...

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

13voto

Plenilune Points 2561

Vous pouvez également créer un tableau de NSInvocation s. C'est pratique si vous avez besoin d'un argument pour aller avec votre sélecteur.

 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
 

1voto

big_m Points 391

Si la liste est statique, j'utiliserais la solution de KennyTM, mais si vous avez besoin d'un tableau ou d'un ensemble dynamique, une autre option, outre le stockage de la chaîne de sélecteur, consiste à créer un objet avec une propriété SEL ou ivar et stocker cela.

 @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
 

Vous pouvez ensuite ajouter une méthode perform à la classe et y implémenter l'appel de méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X