2012-11-21 2 views
-1

Lorsque je tente de changer la valeur cachée d'un bouton avec performSelectorOnMainThread cela fonctionne:Bool valeurs de conversion dans iOS

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:NO waitUntilDone:YES]; 

Mais ceci:

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:YES waitUntilDone:YES]; 

donne cette erreur:

Cannot initialize a parameter of type 'id' with an rvalue of type 'signed char' 

Quel type de conversion interne se produit pour créer cette erreur? Et comment puis-je résoudre cela?

+0

Temps pour lire un papier sur les pointeurs (NULL) ... –

Répondre

4

Le paramètre est nommé withObject:. Un BOOL n'est pas un objet, mais nil peut être passé, et NO est équivalent, donc votre premier exemple fonctionne (par accident).

Vous avez quelques options, mais la plus simple est probablement d'utiliser GCD et d'exécuter la méthode setHidden: dans un bloc sur le thread principal à la place.

0

Si vous faites ce test:

NSArray *array = [NSArray arrayWithObjects:@"a", NO, @"b", nil]; 
NSLog("%@", array); 

vous constaterez que dans le tableau il n'y a qu'un seul objet « a », ce qui signifie que la valeur bool NO est égale à nil. donc en fait votre code travaillé fait comme ça

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:nil waitUntilDone:YES]; 

ce qui est acceptable.

En fait, si vous faites ce test:

NSArray *array = [NSArray arrayWithObjects:@"a", [NSNumber numberWithBool:NO], @"b", nil]; 
NSLog("%@", array); 

vous trouverez il y a trois objets dans un tableau: "a" "0" et "b". donc dans votre code, vous devez appeler comme ceci:

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:[NSNumber numberWithBool:YES/NO] waitUntilDone:YES]; 

Hope that helps!

1

Dans la méthode performSelector, vous devez passer un objet, comme indiqué dans la réponse jrturton. Mais ... le type BOOL est pas un type primitif

ici plus d'informations sur BOOL: http://weblog.bignerdranch.com/564-bools-sharp-corners/

Vous pouvez utiliser cette astuce

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:nil waitUntilDone:YES]; // this is a setHidden:NO 

[pictureButton performSelectorOnMainThread:@selector(setHidden:) withObject:self waitUntilDone:YES]; // this is a setHidden:YES 

je auto, mais vous pouvez utiliser les méthodes existantes objet. Ce sera VRAI.