Problème avec les NSCell |
Bienvenue invité ( Connexion | Inscription )
Problème avec les NSCell |
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 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 Mon message n'est sans doute pas clair, n'hésitez pas a demander plus d'infos J'espère que quelqu'un pourra m'aider @+ Number One |
|
|
9 Sep 2002, 08:34
Message
#2
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 518 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...
|
|
|
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
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... |
|
|
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!!
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 |
|
|
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 |
|
|
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 Qu'est-ce que je fais faux ? |
|
|
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 |
|
|
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 ?
|
|
|
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 |
|
|
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 ?
|
|
|
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...
-------------------- * 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 |
|
|
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!!
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 |
|
|
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! |
|
|
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 Y a une différence ? |
|
|
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 Y a une différence ?
Ca donne quoi avec le debugger? |
|
|
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 |
|
|
Nous sommes le : 23rd September 2024 - 12:27 |