IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Problème avec les NSCell
Options
Number One
posté 9 Sep 2002, 08:00
Message #1


Nouveau Membre


Groupe : Membres
Messages : 27
Inscrit : 15 Sep 2001
Lieu : Lausanne, Suisse
Membre no 805



Hello !!!

J'ai un petit problème avec les NSCell smile.gif

En fait j'ai une NSView qui affiche le contenu d'un jeu et j'aimerais afficher des NSButton (comme dans interface builder) dans cette view.

Dans le fichier de la view, j'ai implémenté la NSCell de cette façon (je sais pas si c'est la bonne manière, mais ça marche, mon bouton s'affiche où je veut dans ma view):

CODE
- (void)drawMainMenuIn:(NSRect)r

{

   NSButton *startGameButton = [[NSButton alloc] initWithFrame:r];



   NSButtonCell *buttonCell = [[NSButtonCell alloc] init];

   

   displayCell.size.width = 200;

   displayCell.size.height = 50;

   displayCell.origin.x = r.size.width / 2 - 100;

   displayCell.origin.y = 230;

   

   [buttonCell setAction:@selector(startGame)];

   [buttonCell setTarget:self];

   

   [startGameButton setCell:buttonCell];

   

   [startGameButton setTitle:@"Nouvelle partie"];

   

   [buttonCell drawWithFrame:displayCell inView:self];



   [startGameButton release];

   [buttonCell release];

}


Mais maintenant comment je fais pour savoir si ce bouton est clické (et exécuter une action?), Programming for Mac OS X et Learning Cocoa sont tout sauf clair sur le sujet… je bloque là dessus depuis un moment, si vous avez une idée smile.gif

Mon message n'est sans doute pas clair, n'hésitez pas a demander plus d'infos wink.gif

J'espère que quelqu'un pourra m'aider…

@+ Number One
Go to the top of the page
 
+Quote Post
Bru
posté 9 Sep 2002, 08:34
Message #2


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 516
Inscrit : 7 Oct 2001
Membre no 962



Normalement, grâce à [buttonCell setAction:@selector(startGame)], à chaque action sur le NSButton (c'est à dire à chaque clic), la méthode d'action startGame est appelée...
Go to the top of the page
 
+Quote Post
Number One
posté 9 Sep 2002, 09:08
Message #3


Nouveau Membre


Groupe : Membres
Messages : 27
Inscrit : 15 Sep 2001
Lieu : Lausanne, Suisse
Membre no 805



C'est ce que je pensais aussi, mais ça ne marche pas sad.gif
J'ai vu qu'il y avais une méthode performClick pour NSCell (je crois), mais je ne sais pas du tout comment l'implémenter...
Go to the top of the page
 
+Quote Post
LeJeff
posté 9 Sep 2002, 15:19
Message #4


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 482
Inscrit : 5 Jul 2001
Lieu : Quelque part entre ici et là-bas
Membre no 466



c'est normal, tu ne fais qu'afficher ton NSCell et après, tu le détruis!! ohmy.gif
Il faut que le NSButtonCell soit créé et détruit en même temps que ta vue, sinon ça ne sert à rien.

De plus, dans ce cas précis, tu n'as pas besoin de créer un NSButton (qui est un descendant de NSView) ET un NSButtonCell... un seul suffit, mais dans le cas du NSCell, c'est à ta vue de gérer les évènements souris ou clavier et de les transmettre au NSCell (par la méthode 'PerformClick:' entre autre).
Je te conseille, si tu lis l'anglais, de re(?)lire la doc développeur sur la différence entre NSView et NSCell.

Voilà, j'espère avoir été assez clair!
Jef


--------------------
* iMac 24" Core2Duo 2,93GHz - 4Go - 640Go - Radeon 4850
* MacbookPro 13" 2,53HGz - 4Go
* Iphone 3G 16Go, iPod Classic 80Go
* NAS Synology DS-209 2x1To + Linksys WRT320N
Go to the top of the page
 
+Quote Post
Number One
posté 9 Sep 2002, 15:35
Message #5


Nouveau Membre


Groupe : Membres
Messages : 27
Inscrit : 15 Sep 2001
Lieu : Lausanne, Suisse
Membre no 805



Merci beaucoup !

J'essaie tout ça ce soir !

Donc si j'ai bien compris, en utilisant NSButtonCell, pas besoin d'intercepter les événemements mais avec NSCell si ?

Je vais me replonger dans la doc, même si je trouvais quelle était pas très clair sur le sujet wink.gif
Go to the top of the page
 
+Quote Post
Number One
posté 9 Sep 2002, 16:33
Message #6


Nouveau Membre


Groupe : Membres
Messages : 27
Inscrit : 15 Sep 2001
Lieu : Lausanne, Suisse
Membre no 805



J'ai modifié ma méthode comme ça (NSButtonCell est initialisé lors de l'init):

CODE
- (void)drawMainMenuIn:(NSRect)r

{  

    displayCell.size.width = 200;

    displayCell.size.height = 50;

    displayCell.origin.x = r.size.width / 2 - 100;

    displayCell.origin.y = 230;

   

    [buttonCell setAction:@selector(startGame)];

    [buttonCell setTarget:self];

   

    [buttonCell setTitle:@"Nouvelle partie"];

   

    [buttonCell drawWithFrame:displayCell inView:self];

}


et la méthode drawMainMenuIn est appellée lors du drawRect qui affiche la vue principale… mais ça marche pas sad.gif Qu'est-ce que je fais faux ?
Go to the top of the page
 
+Quote Post
nucleus
posté 9 Sep 2002, 17:51
Message #7


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 351
Inscrit : 17 May 2001
Lieu : Paris
Membre no 256



Question con: Ou crées-tu ton instance de NSButtonCell?

PS: Tu n'est pas obligé de parametrer ton buttonCell à chaque affichage.. surtout si rien de change à ce niveau là

PS2: Ne pas oublier la destruction
Go to the top of the page
 
+Quote Post
Number One
posté 9 Sep 2002, 19:04
Message #8


Nouveau Membre


Groupe : Membres
Messages : 27
Inscrit : 15 Sep 2001
Lieu : Lausanne, Suisse
Membre no 805



Hum mon instance… dans MaView.h (si c'est de ça dont tu parles) et dans initWithFrame je l'ai initialisée… Mais en théorie, ma méthode devrais marcher ?
Go to the top of the page
 
+Quote Post
LeJeff
posté 9 Sep 2002, 19:12
Message #9


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 482
Inscrit : 5 Jul 2001
Lieu : Quelque part entre ici et là-bas
Membre no 466



Bon, je suis sur mon mac maintenant, et j'ai pu regarder un peu plus sérieusement tout ça...

Voici donc ma proposition:
CODE
- (id)initWithFrame:(NSRect *)rect

{

    NSButton *startGameButton;

    self = [super initWithFrame:rect];

    if (self == nil)

 return self;



    startGameButton = [[NSButton alloc]

   initWithFrame:NSMakeRect(rect.size.width / 2 - 100,

       230,

       200,

       50)];

    [smartGameButton setAction:@selector(startGame)];

    [smartGameButton setTarget:self];

    [smartGameButton setAutoresizingMask: (NSViewMinXMargin+NSViewMaxXMargin+

           NSViewMinYMargin+NSViewMaxYMargin)];

    [self addView:smartGameButton];



    [smartGameButton release];



    return self;

}

Explication: ce que tu veux faire, le NSView le fait tout seul, mais avec un autre NSView mais pas un NSCell. C'est un poil plus lourd pour le système, mais beaucoup plus simple à gérer.
Note, la méthode 'setAutoresisingMask:' indique, dans ce cas, que le bouton reste centré par rapport à sa position en cas de redimensionnement de la vue.

Voilà, j'espère que c'est bon cette fois.
Jef


--------------------
* iMac 24" Core2Duo 2,93GHz - 4Go - 640Go - Radeon 4850
* MacbookPro 13" 2,53HGz - 4Go
* Iphone 3G 16Go, iPod Classic 80Go
* NAS Synology DS-209 2x1To + Linksys WRT320N
Go to the top of the page
 
+Quote Post
Number One
posté 9 Sep 2002, 19:46
Message #10


Nouveau Membre


Groupe : Membres
Messages : 27
Inscrit : 15 Sep 2001
Lieu : Lausanne, Suisse
Membre no 805



Désolé pour ces questions de débutant, mais c'est ma première "vraie" application et j'ai de la peine a comprendre les NSCell… même si je comprends les NSView… Dans ton exemple, l'objet smartGameButton est de type NSView ? Parce que chez moi il fait une erreur: il dit que smartGameButton ne réagit pas à la méthode setAction (même si j'ai vu dans la doc que ça devrais fonctionner…), une idée ?
Go to the top of the page
 
+Quote Post
LeJeff
posté 9 Sep 2002, 20:51
Message #11


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 482
Inscrit : 5 Jul 2001
Lieu : Quelque part entre ici et là-bas
Membre no 466



Heu, en effet, quelques petites explications s'imposent...
    La méthode 'initWithFrame:' est celle de la vue dans laquelle tu veux placer le bouton,
  • smartGameButton est un NSButton (sous classe de NSControl)
  • la méthode 'setAction:' est déclarée par NSControl
    [list]

    Cocoa Developer Documentation > User Interface Elements > Controls and Cell


--------------------
* iMac 24" Core2Duo 2,93GHz - 4Go - 640Go - Radeon 4850
* MacbookPro 13" 2,53HGz - 4Go
* Iphone 3G 16Go, iPod Classic 80Go
* NAS Synology DS-209 2x1To + Linksys WRT320N
Go to the top of the page
 
+Quote Post
LeJeff
posté 9 Sep 2002, 20:54
Message #12


Macbidouilleur de bronze !
**

Groupe : Membres
Messages : 482
Inscrit : 5 Jul 2001
Lieu : Quelque part entre ici et là-bas
Membre no 466



Oups, désolé... j'ai cliqué sur le mauvais bouton!! biggrin.gif

Sinon, pour ta question sur la différence entre vue et cellule, jette un coup d'oeil dans la doc COCOA, chemin suivant:
Cocoa Developer Documentation > User Interface Elements > Controls and Cell

Cela devrait t'aider un peu, mais je pense que dans ton cas, un NSButton est plus simple à gérer.

Jef


--------------------
* iMac 24" Core2Duo 2,93GHz - 4Go - 640Go - Radeon 4850
* MacbookPro 13" 2,53HGz - 4Go
* Iphone 3G 16Go, iPod Classic 80Go
* NAS Synology DS-209 2x1To + Linksys WRT320N
Go to the top of the page
 
+Quote Post
Number One
posté 9 Sep 2002, 20:56
Message #13


Nouveau Membre


Groupe : Membres
Messages : 27
Inscrit : 15 Sep 2001
Lieu : Lausanne, Suisse
Membre no 805



Une autre chose que je comprends pas, quand je copie-colle le code que tu m'as passé, le compilateur me dit ça:

BreakOut.m:83: illegal expression, found `unknown'

a chaque ligne alors que la syntaxe est juste, j'en suis sûr!
Go to the top of the page
 
+Quote Post
Number One
posté 9 Sep 2002, 21:04
Message #14


Nouveau Membre


Groupe : Membres
Messages : 27
Inscrit : 15 Sep 2001
Lieu : Lausanne, Suisse
Membre no 805



J'en profite d'avoir un developpeur sous la main pour pauser une autre question qui m'énerve, si j'appelle une méthode en faisant ça:

CODE
- (void)keyDown:(NSEvent *)theEvent

{

   unichar keyMap;

   

   [[theEvent characters] getCharacters:&keyMap];



if (keyMap == NSRightArrowFunctionKey) [self restartGame];

}


ça marche, mais si j'appelle la même méthode restartGame via la méthode (que j'ai liée a un menu dans IB):

CODE
- (IBAction)startGame:(id)sender

{

   [self restartGame];

}


ben restartGame est appelé mais pas complétement exécuté… enfin ça marche pas sad.gif Y a une différence ?
Go to the top of the page
 
+Quote Post
nucleus
posté 9 Sep 2002, 23:56
Message #15


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 351
Inscrit : 17 May 2001
Lieu : Paris
Membre no 256



QUOTE
ben restartGame est appelé mais pas complétement exécuté… enfin ça marche pas sad.gif Y a une différence ?


Ca donne quoi avec le debugger?
Go to the top of the page
 
+Quote Post
nucleus
posté 10 Sep 2002, 00:09
Message #16


Macbidouilleur de vermeil !
****

Groupe : Membres
Messages : 1 351
Inscrit : 17 May 2001
Lieu : Paris
Membre no 256



QUOTE
Désolé pour ces questions de débutant, mais c'est ma première "vraie" application et j'ai de la peine a comprendre les NSCell… même si je comprends les NSView…


NSButton est une spécialisation de la classe NSView, or chaque instance de type NSView est assez lourde à créer car en gros une NSVew est matérialisée par une fenêtre (sans bords) pour le gestionnaire de fenêtres..

S'il n'y a pas beaucoup de NSButton ce n'est pas un problème, mais si par exemple tu veux faire une calculatrice avancée tu va te rendre compte que c'est vraiment pas une bonne idée d'utiliser NSButton pour faire chaque bouton: ca va ramer.

Mais pour ne pas perdre l'interet d'une classe qui sait gérer et afficher un bouton, et pour pouvoir réutiliser le code sans copier-coller (la pire des réutilisations en objet), tu as NSButtonView qui encapsule la logique spécifique à un bouton mais qui ne crée pas de fenêtre.

Ainsi pour ta calculatrice tu n'as besoin de créer qu'une seule vue (par exemple NSMatrix) qui contient plusieurs de NSButtonCell

La classe NSButton est donc une fenêtre avec un NSButtonCell. Le NSButton s'occupe de gérer l'espace sur l'écran, le NSButtonCell s'occupe du reste

Si tu regarde dans la doc, tu verra beaucoup de couple View/Cell qui fonctionnent selon le même principe..

Certaines NSView sont conçues pour regrouper plusieurs cells et permettre un affichage et une interaction complexe dans une seule NSView, comme la NSTableView
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
3 utilisateur(s) sur ce sujet (3 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 31st May 2024 - 02:05