[Résolu] Bindings et constantes

GrmGrm Membre
novembre 2010 modifié dans Xcode et Developer Tools #1
Bonjour,

ça fait un moment que je me sers de ce forum, pour en apprendre un peu plus sur le dev Mac; ça fait bientôt 6 mois  <3 <br />
Donc je me lance enfin.

Dans le cadre de mon application je cherche à  effectuer, pour éviter le devoir faire les changements à  la main, un bind sous IB entre le titre d'un bouton, et une constante déclarer classiquement (
extern NSString * const BAGBinToDec;
dans le .h et
NSString * const BAGBinToDec = @&quot;Bin -&gt; Décimal&quot;;
dans le .m).

Mais voilà  comme souvent ça marche pas ( erreur :
&quot;this class is not key value coding-compliant for the key BAGDecToBin. &quot;
), je pense que l'erreur vient du fait que je n'ai pas d'accesseur pour ma constante, mais je ne sais pas si je dois en déclarer (dans ce cas ce n'est plus une constante ).

Vous en pensez quoi ? Et sinon vous avez une meilleure solution ?

Réponses

  • laudemalaudema Membre
    13:07 modifié #2
    dans 1288732430:

    je pense que l'erreur vient du fait que je n'ai pas d'accesseur pour ma constante, mais je ne sais pas si je dois en déclarer (dans ce cas ce n'est plus une constante ).

    Quel est le problème à  ce qu'un accesseur renvoie la valeur de ta constante ?
    <br />//Dans le .h<br />@property (assign, readonly)NSString *maConstante;//Enlever readonly et écrire le setter si on veut readwrite<br />//Dans le .m<br />- (NSString*)maConstante{<br />&nbsp; &nbsp; return BAGBinToDec;<br />}<br />
    


    D'autre part, comment comptes tu changer la valeur si tu utilise une constante ?
  • CéroceCéroce Membre, Modérateur
    13:07 modifié #3
    Binder une constante ne présente pas d'intérêt puisque les bindings servent à  synchroniser les vues et le modèle...
  • laudemalaudema Membre
    13:07 modifié #4
    Sauf si il veut que le titre de son bouton se charge de cette valeur au démarrage, par exemple. C'est vrai que c'est curieux mais bon, il a peut être une bonne raison.
  • GrmGrm Membre
    novembre 2010 modifié #5
    Merci pour les réponses :D

    Effectivement binder une constante ne présente pas d'intérêt  ( question de logique, j'aurais du réfléchir deux fois plutôt qu'une ).

    Mais je pensais utiliser ceci afin de pouvoir comparer les titres de mes boutons pour déterminer l'action à  effectuer suivant le sender ( j'ai une action globale qui va modifier son comportement suivant le bouton pressé ). Mais la comparaison string à  string c'est bien mais je modifie le titre d'un de mes boutons je dois aussi modifier dans mon code (je le sais, j'ai passé du temps pour m'apercevoir que mon erreur venait de ça  :o ), donc je pensais à  la solution du binding pour éviter ce souci.

    Et la solution de faire une action par bouton me déplait car je vais multiplier du code.

    Qu'est-ce qui serait le meilleur d'après vous ?

    [Edit] : Merci laudema, je viens d'essayer ta proposition, elle marche du tonnerre ! Mais si vous avez de meilleur idées dites le moi.
  • CéroceCéroce Membre, Modérateur
    13:07 modifié #6
    L'action et la cible sont des variables d'instance de NSControl. Ceci signifie qu'il est tout à  fait possible de partager une même action pour plusieurs NSControls:

    <br />- (IBAction) buttonClicked:(NSButton *)sender<br />{<br />	if(sender == firstButton)<br />	{<br />		...<br />	}<br />	<br />	else if (sender == secondButton)<br />	{<br />		...	<br />	}<br /><br />	...<br />}<br /><br />
    


    Note que je compare les pointeurs sur les IBOutlets firstButton et secondButton; je préfère faire ainsi pour attraper les erreurs à  la compilation plutôt qu'à  l'exécution.


    Compare avec cette alternative:
    - (IBAction) buttonClicked:(NSButton *)sender<br />{<br />	switch([sender tag])<br />	{<br />		case FIRST_BUTTON_TAG:<br />			...<br />		break;<br />		<br />		case SECOND_BUTTON_TAG:<br />			...<br />		break;	<br />		<br />		...<br />	}<br />}
    


    Le tag d'un NSControl peut être fixé sous IB. Cela évite de déclarer des outlets vers tous les boutons, mais impose d'avoir les mêmes constantes dans le XIB et le code.

  • GrmGrm Membre
    novembre 2010 modifié #7
    Merci Céroce,

    Je ne connaissais pas l'utilisation des Tags, c'est pratique et en plus ça m'a permis d'alléger mon code (je trouve le switch beaucoup plus léger qu'une suite de if else if).

    Je pense que l'on peut mettre ce post en résolu, à  moins que ce soit à  moi de le faire mais j'ai pas trouvé le bouton (pas taper  >:) )
  • AliGatorAliGator Membre, Modérateur
    13:07 modifié #8
    Pour le "résolu" il n'y a pas de bouton, c'est à  l'appréciation de l'auteur du post de modifier le titre (il suffit d'éditer le premier message de cette discussion que tu as écrit pour ça) si cela lui sied.
Connectez-vous ou Inscrivez-vous pour répondre.