Estoy usando el iPhone SDK (3.0) y estoy tratando de crear una matriz de selectores para invocar una variedad de métodos dentro de una clase.
Obviamente, estoy haciendo algo mal (creo que @selector no se considera una clase y, por lo tanto, meterlos en un NSArray no funciona).
Intenté esto, pero obviamente está mal.
¿Existe una forma sencilla de tener una matriz de selectores como esta? ¿O hay una mejor manera de iterar a través de una colección de métodos?
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;
}
ios
objective-c
nsarray
selector
usuario141146
fuente
fuente
NSPointerArray
es mejor.Esto crea un objeto fuera del selector:
[NSValue valueWithPointer:@selector(x)]
fuente
performSelector:
?SEL x = (SEL)selectorValue.pointerValue;
¿Por qué no usar simplemente una matriz 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]]; // .... }
fuente
static
no es necesario aquí (el inicializador no es una constante en tiempo de compilación).También puede crear una matriz de
NSInvocation
s. Esto es útil si necesita un argumento que vaya con su selector.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
fuente
Si la lista es estática, optaría por la solución de KennyTM, pero si necesita una matriz o un conjunto dinámico, otra opción, además de almacenar la cadena de selección, es crear un objeto con una
SEL
propiedad o ivar y almacenarlo.@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
A continuación, también puede agregar un
perform
método a la clase e implementar la llamada al método allí.fuente
Me gustaría complementar dos métodos para almacenar selectores en una matriz,
Primero,
NSPointerArray
puede almacenar un puntero opaco, comoSEL
, como dijo Apple doc ,NSPointerArray *selectors = [[NSPointerArray alloc] initWithOptions: NSPointerFunctionsOpaqueMemory]; [selectors addPointer:@selector(onSendButton:)]; [button addTarget: self action:[selectors pointerAt:0] forControlEvents:UIControlEventTouchUpInside];
En segundo lugar, la matriz de estilo C es mucho más simple,
SEL selectors[] = { @selector(onSendButton:) }; [button addTarget: self action:selectors[0] forControlEvents:UIControlEventTouchUpInside];
Elija cualquiera que desee.
fuente