Souci avec performSelector
devulder
Membre
Bonjour,
J'essaie de changer le type d'un bouton
Pas de souci avec le code suivant
Par contre, un test avec performSelector
Cela ne marche pas !
Une piste ??
Merci
J'essaie de changer le type d'un bouton
Pas de souci avec le code suivant
<br />
NSButton *button;<br />
<br />
[button setButtonType:NSRadioButton];<br />
<br />
Par contre, un test avec performSelector
<br />
<br />
NSNumber *vt = [NSNumber numberWithUnsignedInteger:NSRadioButton];<br />
<br />
[button performSelector:@selector(setButtonType:) withObject:vt];<br />
<br />
Cela ne marche pas !
Une piste ??
Merci
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mais combiné à NSSelectorFromString ça peut être utile dans certains cas.
Si c'est pour choisir parmi plusieurs selector qui ont le même nom ou des choses comme ça, y'a pas de mystère : performSelector:withObject: ne marche qu'avec des paramètres de type "id", donc des objets. Pour les autres types et signatures, tu dois utiliser NSInvocation.
Si tu as à l'utiliser à plusieurs reprises dans ton code, ça vaut le coup de faire une méthode générique qui construit la NSInvocation et prend un nombre variable d'arguments avec lesquels il remplit la NSInvocation avant de l'appeler... la méthode en question à mettre au point prendra quelques lignes, mais après à utiliser ça sera un vrai bonheur...
A moins que tu ais besoin d'être compatible iOS3, sinon tu peux utiliser dispatch_after à la place (ouais je suis assez fan de GCD ^^)
Et sinon pour l'équivalent d'un performSelector tout court (sans afterDelay) mais à qui on veut passer des arguments de type autre qu'un objet, au lieu d'utiliser des NSInvocation, on peut aussi récupérer la fonction C associée au @selector de l'objet, et appeler la fonction C ensuite ! Il faut juste penser à caster le pointeur de fonction retourné correctement. (Voir la doc ici entre autres) :
Je vais voir si cela donne de bons résultats