2011-12-19 12 views
10

Questo è il mio codice:Cast a BOOL per id in Objective-C

[delegate performSelectorOnMainThread:@selector(setVariablePremierAffichage:) withObject:TRUE waitUntilDone:NO]; 

Il problema è che l'argomento "withObject" richiede solo un tipo di "id", così, come posso lanciare il mio valore " VERO "a un tipo di identificazione? Utilizzo anche la gestione della memoria ARC in Xcode per iOS 5.

+0

La risposta avete ottenuto è corretto. Ma, piuttosto che saltare attraverso i cerchi per forzare qualcosa di simile a funzionare, dovresti chiederti perché stai usando 'performoSelectorOnMainThread' in primo luogo? Perché non usare direttamente '[delegate setVariablePremierAffichage: YES]' direttamente? – Abizern

+1

@Abizem, hai ragione a seconda del contesto. L'OP potrebbe chiamarlo da un altro thread. Anche in quel caso, usando 'dispatch_async' invece di' performSelectorOnMainThread: 'consentirebbe di chiamare il metodo senza usare NSNumber. Tuttavia, non chiamerei questo "saltare attraverso i cerchi". È una scelta di implementazione ragionevole, ancora una volta, a seconda del contesto. – XJones

risposta

20

Passa un NSNumber. Utilizzare boolNumber = [NSNumber numberWithBool:TRUE]. Il tuo metodo dovrebbe essere definito come:

-(void)setVariablePremierAffichage:(NSNumber *)boolNumber 
{ 
    BOOL value = [boolNumber boolValue]; 
    // do something 
} 
+2

Penso che intendessi dire '[NSNumber numberWithBool: YES]' come convenzione Objective-C per BOOLs è 'YES' e' NO' invece di 'TRUE' e' FALSE' – Abizern

+0

funzionano come VERO/FALSO. – XJones

+2

Sì, funziona, ma ci sono convenzioni e SÌ/NO è quello per Objective-C. – Abizern

0

Non c'è modo di trasmettere una primitiva a un ID. Se avete bisogno di chiamare un metodo dinamico come ad esempio con performSelector è necessario utilizzare NSInvocation:

NSMethodSignature *sig = [self methodSignatureForSelector:@selector(setVariablePremierAffichage:)]; 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; 
BOOL yes = YES; 
[invocation setArgument:&yes atIndex:2]; 
[invocation setTarget:self]; 
[invocation setSelector:@selector(setVariablePremierAffichage:)]; 
[invocation invoke]; 

Cheers!

4

Usa CFbooleanreference e gettalo via

[delegate performSelectorOnMainThread:@selector(setVariablePremierAffichage:) withObject:(id)kCFBooleanTrue waitUntilDone:NO]; 
+0

Grazie per la condivisione! – smileBot