28 votes

iPhone: performSelector avec le paramètre BOOL?

Existe-t-il un moyen d'envoyer BOOL dans le sélecteur?

 [self performSelector:@selector(doSomething:) withObject:YES afterDelay:1.5];
 

Ou devrais-je utiliser NSInvocation? Quelqu'un pourrait-il écrire un échantillon s'il vous plaît?

46voto

Niv Points 837

vous pouvez utiliser NSNumber pour encapsuler les types de bools:

 BOOL myBool = Yes;
NSNumber *passedValue = [NSNumber numberWithBool:myBool];
[self performSelector:@selector(doSomething:) withObject:passedValue afterDelay:1.5];
 

et dans le sélecteur, pour obtenir la valeur booléenne, vous utilisez:

 BOOL value = [recievedObject boolValue];
 

43voto

TomSwift Points 22012

Dans le cas où vous ne pouvez pas modifier la signature de la méthode cible pour accepter un NSNumber à la place d'un BOOL vous pouvez utiliser NSInvocation au lieu de performSelector :

 MyTargetClass* myTargetObject;
BOOL myBoolValue = YES; // or NO

NSMethodSignature* signature = [[myTargetObject class] instanceMethodSignatureForSelector: @selector( myMethodTakingBool: )];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
[invocation setTarget: myTargetObject];
[invocation setSelector: @selector( myMethodTakingBool: ) ];
[invocation setArgument: &myBoolValue atIndex: 2];
[invocation invoke];
 

13voto

user2142920 Points 61

utilisez dispatch_after dans le fil principal comme ceci:

 dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (_animationDuration+1) * NSEC_PER_SEC);
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
    [self completeAnimation:NO];
});
 

10voto

malex Points 2992

La manière la plus simple est la suivante:

Si vous avez la méthode

 -(void)doSomething:(BOOL)flag
 

et souhaitez effectuerSelecor avec flag = NO use

 [object performSelector:@selector(doSomething:) withObject:nil];
 

En cas de flag = YES, vous pouvez envoyer n'importe quel objet, par exemple, @YES - numéro de bool

  [object performSelector:@selector(doSomething:) withObject:@YES];
 

Remarque: n'utilisez pas @NO! Seul nil sera interprété comme NON dans votre méthode avec l'argument bool.

5voto

Gonzo Oin Points 111

si vous voulez passer un NON, et seulement un NON, vous pouvez mettre un zéro à la place

 [self performSelector:@selector(doSomething:) withObject:0 afterDelay:1.5];
 

Mais rappelez-vous, ne travaillez que pour zéro, ne compile pas avec ARC qui interdit la conversion implicite

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