Tengo un método como este:

-(void)fastTapCartBack:(NSString*)ActionType

Y quiero usarlo como selector en NSTimer así:

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:[self performSelector:@selector(fastTapCartBack:) withObject:@"FAST"] userInfo:nil repeats:NO]

Pero tiene error:

La conversión implícita de un puntero de Objective-C a "SEL _Nonnull" no está permitida con ARC

1
SaMi GiMiX 22 feb. 2018 a las 12:14

2 respuestas

La mejor respuesta

No puede pasar un segundo parámetro en el patrón objetivo / acción.

Sin embargo, en el caso de NSTimer hay una solución muy adecuada, el parámetro userInfo

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 
                                              target:self 
                                            selector:@selector(fastTapCartBack:)
                                            userInfo:@"FAST" 
                                             repeats:NO];

Y obtener la información en el método selector

-(void)fastTapCartBack:(NSTimer *)timer {
     NSString *info = (NSString *)timer.userInfo;
}
1
vadian 22 feb. 2018 a las 09:31

Estás pasando una llamada de método [self performSelector:@selector(fastTapCartBack:) withObject:@"FAST"] como selector, esto no está permitido por Objective-C

reemplazar esto

self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:[self performSelector:@selector(fastTapCartBack:) withObject:@"FAST"] userInfo:nil repeats:NO];

Por esto

Debería utilizar la forma NSInvocation

NSMethodSignature * signature = [ViewController instanceMethodSignatureForSelector:@selector(fastTapCartBack:)];
NSInvocation * invocation = [NSInvocation
             invocationWithMethodSignature:signature];
[invocation setTarget:self];
[invocation setSelector:@selector(fastTapCartBack:)];
NSString * argument = @"FAST";
[invocation setArgument:&argument atIndex:2];

self.timer2 = [NSTimer scheduledTimerWithTimeInterval:1 invocation:invocation repeats:NO];
1
Reinier Melian 22 feb. 2018 a las 09:48