2011-12-19 9 views
10

To jest mój kod:Rzucić BOOL do id w Objective-C

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

Problem polega na tym, że argument "withObject" trwa jedynie "ID" typu, więc jak mogę rzucić moje wartości " TRUE "do typu id? Używam również zarządzania pamięcią ARC w Xcode dla iOS 5.

+0

Odpowiedź musisz zdobyć jest poprawna. Ale zamiast przeskakiwać przez obręcze, aby wymusić coś takiego, powinieneś zadać sobie pytanie, dlaczego używasz 'performoSelectorOnMainThread' w pierwszej kolejności? Dlaczego po prostu nie użyjesz '[delegate setVariablePremierAffichage: YES]' bezpośrednio? – Abizern

+1

@Abizem masz rację w zależności od kontekstu. OP może wywoływać to z innego wątku. Nawet w takim przypadku użycie 'dispatch_async' zamiast' performSelectorOnMainThread: 'pozwoliłoby na wywołanie metody w/o przy użyciu NSNumber. Jednak nie nazwałbym tego "przeskakiwaniem przez obręcze". Jest to rozsądny wybór wdrożenia, także w zależności od kontekstu. – XJones

Odpowiedz

20

Przekaż NSNumber. Użyj boolNumber = [NSNumber numberWithBool:TRUE]. Twoja metoda powinna być zdefiniowana jako:

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

Myślę, że miałeś zamiar powiedzieć '[NSNumber numberWithBool: YES]' jako konwencja Objective-C dla BOOL-a również 'YES' i' NO' zamiast 'TRUE' i' FALSE' – Abizern

+0

TRUE/FALSE. – XJones

+2

Tak, działa, ale są konwencje i TAK/NIE jest tym dla Celu-C. – Abizern

0

Nie ma sposobu, aby przesłać prymityw do identyfikatora. Jeśli chcesz wywołać metodę dynamicznie, np. Z performSelector, będziesz musiał użyć 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]; 

Pozdrawiam!

4

Zastosowanie CFbooleanreference i rzucić to

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

Niż za udział! – smileBot

Powiązane problemy