IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apple Discussion :

NSArray de IBOutlet de et IBAction, svp [Cocoa]


Sujet :

Apple

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 163
    Points
    163
    Par défaut NSArray de IBOutlet de et IBAction, svp
    Bonjour,

    Il ne semble pas que la partie Cocoa de ce site soit aussi vivante que celle consacrée à Java. Essayons tout de même...

    Après des années de Java, je me lance dans ObjectivC/Cocoa. Super!

    Je voulais donc adapter un logiciel fait en Java pour bénéficier des méthodes plus complètes de Cocoa. Dans ce logiciel, j'avais fait des tableaux de boutons initialisés grâce à des tableaux de valeurs et une grille de placement sur la fenêtre.
    Le code était du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (int i = 0; i<66; i++){
    			BoutonTriangle[i] = new JButton();
    			BoutonTriangle[i].setPreferredSize(new Dimension(10,10));
    			GBC.gridx = (XTriangle[i]+2); GBC.gridy = (YTriangle[i]+2);
    			GBC.gridwidth = 2; GBC.gridheight = 2;
    			GBC.weightx = 2; GBC.weighty = 2;
    			BoutonTriangle[i].addActionListener
    			(new EcouteBoutonTriangle (i, ValCoul, ValTri, ValPal, Tab, palette, action));
    			BoutonTriangle[i].setBackground(
    					Color.getHSBColor(action.getHueFond(), ValTri[i].getSaturation(),
    					ValTri[i].getBright()));
    			add (BoutonTriangle[i], GBC);
    			}
    Ce code permettait de créer en quelques lignes 66 boutons, puis 44 pour une autre série, et enfin 24 pour la dernière, avec placement, couleur, et écoute (l'équivalent Java du IBAction).

    En Cocoa, j'ai vu les "matrix", mais j'ai dû dériver NSButton pour les mettre en couleur, et les CustomView utilisées dans InterfaceBulder ne semblent pas être "matriciables" (pardon pour le barbarisme).

    Verriez-vous une possibilité autre que de rentrer 134 IBOutlet et autant de IBActions dans le code de ObjectivC? (cent trente quatre, et plus encore!! mais les autres sont des boutons Aqua normaux, et il n'y en a pas trop)

    Merci d'avance si vous avez une idée.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 952
    Points : 4 378
    Points
    4 378
    Par défaut
    Citation Envoyé par HNoury Voir le message
    Bonjour,

    Il ne semble pas que la partie Cocoa de ce site soit aussi vivante que celle consacrée à Java. Essayons tout de même...

    Après des années de Java, je me lance dans ObjectivC/Cocoa. Super!

    Je voulais donc adapter un logiciel fait en Java pour bénéficier des méthodes plus complètes de Cocoa. Dans ce logiciel, j'avais fait des tableaux de boutons initialisés grâce à des tableaux de valeurs et une grille de placement sur la fenêtre.
    Le code était du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (int i = 0; i<66; i++){
    			BoutonTriangle[i] = new JButton();
    			BoutonTriangle[i].setPreferredSize(new Dimension(10,10));
    			GBC.gridx = (XTriangle[i]+2); GBC.gridy = (YTriangle[i]+2);
    			GBC.gridwidth = 2; GBC.gridheight = 2;
    			GBC.weightx = 2; GBC.weighty = 2;
    			BoutonTriangle[i].addActionListener
    			(new EcouteBoutonTriangle (i, ValCoul, ValTri, ValPal, Tab, palette, action));
    			BoutonTriangle[i].setBackground(
    					Color.getHSBColor(action.getHueFond(), ValTri[i].getSaturation(),
    					ValTri[i].getBright()));
    			add (BoutonTriangle[i], GBC);
    			}
    Ce code permettait de créer en quelques lignes 66 boutons, puis 44 pour une autre série, et enfin 24 pour la dernière, avec placement, couleur, et écoute (l'équivalent Java du IBAction).

    En Cocoa, j'ai vu les "matrix", mais j'ai dû dériver NSButton pour les mettre en couleur, et les CustomView utilisées dans InterfaceBulder ne semblent pas être "matriciables" (pardon pour le barbarisme).

    Verriez-vous une possibilité autre que de rentrer 134 IBOutlet et autant de IBActions dans le code de ObjectivC? (cent trente quatre, et plus encore!! mais les autres sont des boutons Aqua normaux, et il n'y en a pas trop)

    Merci d'avance si vous avez une idée.
    Les composants visuels d'une NSMatrix sont des NSCell pas des NSView.
    Une fois votre sous-classe de NSCell au point, NSMatrix a toutes les fonctions pour rajouter des lignes et des colonnes.
    NSCell a les méthodes nécessaires pour définir l'action associée.
    L'avantage de ce design étant que le NSCell sert comme sorte de template à toutes les cellules de la NSMatrix (voir la doc de setCellClass) et qu'une NSCell est beaucoup plus légère qu'une NSView : le dessin d'une NSMatrix basée sur des NSCell sera toujours plus rapide que celui d'une NSView simulant le même comportement avec des sous-vues.

    Le seul IBOutlet qui a un intérêt est celui de la NSMatrix.
    Et un IBOutlet est une meta information associée a un champ d'une classe, cette information ne sert qu'à IB pour savoir quels champs présenter dans son UI, cette information n'existe pas au runtime. (l'équivalent de RetentionPolicy.SOURCE en Java)
    Il est possible de rajouter des champs (et des méthodes) à une classe (ou à une instance) au runtime mais c'est hors sujet pour ce que vous essayez de faire.
    Si vous avez besoin d'accéder directement à chaque composant de la matrice vous pouvez utiliser le "tag" des NSCell pour les identifier.
    Les stocker dans en tableau du Controller est aussi possible mais pas très OO question design.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 163
    Points
    163
    Par défaut
    Merci JeitEmgie pour votre réponse. J'ai réussi à résoudre le problème avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    NSRect frame = NSMakeRect((BASECOULX + (XCouleur[num]*LARGEURCOUL)), 
    								  (BASECOULY + (YCouleur[num]*HAUTEURCOUL)), 
    								  LARGEURCOUL, HAUTEURCOUL);
    		boutons[num] = [[MonBouton alloc]initWithFrame:frame];
    		NSActionCell *cell = [boutons[num] cell];
    		[cell setTarget:self];
    		[cell setAction:@selector(buttonClicked:)];
    		[boutons[num] changeCouleur:(float)((355.0 - 115.0*(num-22)/11.0)/360.0)];
    		[self addSubview:boutons[num]];
    plus une méthode IBActionNSButton*) bouton[num];

    Merci.

    note : BASECOULX et autres valeurs permettent de positionner d'un coup tous les boutons en les modifiant.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Important à lire par tous SVP
    Par Community Management dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2010, 22h54
  2. [TP]Help pour insertion d'un image sur tp7 svp !
    Par ilym dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 21/01/2004, 21h00
  3. Votre avis sur 1 livre SVP
    Par cab dans le forum DirectX
    Réponses: 4
    Dernier message: 17/09/2003, 10h39
  4. Réponses: 3
    Dernier message: 28/02/2003, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo