ma Subview ne se met pas a jour.. (drawRect, setNeedsDisplay et toute la clique)
Maat
Membre
Salut les gars,
Je debute sur Cocoa, je suis content de trouver ce forum en francais
Le code suivant affiche une image (Monstre.jpg) dans une vue (maVue). J'aimerais que cette image monte de 10 pixels quand je clique sur un NSButton.
Cette image apparait bien mais elle bouge pas quand je clique sur le bouton !
J'ai essayé de mettre le code deplacement dans un -drawRect: , j'ai essayé de mettre des -setNeedsDisplay, rien n'y fait je ne comprend vraiment pas.
Qu'en pensez vous ?
Voici le code
#import <Cocoa/Cocoa.h>
@interface maVue : NSView
{
NSImageView * monMonstre;
int nombre;
}
@property (readwrite) int nombre;
- (IBAction)boutonClic:(id)sender;
@end
#import "maVue.h"
@implementation maVue
- (void)initWithFrame:(NSRect)frame
{
if(self = [super initWithFrame:frame])
{
nombre = 2;
monMonstre = [[NSImageView alloc] init];
[monMonstre setImage:[NSImage imageNamed:@monstre.jpg]];
NSSize mSize = [monMonstre image].size;
NSRect monstreFrame;
monstreFrame = NSMakeRect(0.0f, [self nombre], mSize.width, mSize.height);
[monMonstre setFrame:monstreFrame];
[self addSubview:monMonstre];
}
return self;
}
- (IBAction)boutonClic:(id)sender
{
[self setNombre:[self nombre]+10];
NSRect frame = [monMonstre frame];
frame.origin.y = [self nombre];
[monMonstre setFrame:frame]
//[self setNeedsDisplay:YES];
}
- (void)setNombre:(int)nouveauNombre
{
nombre=nouveauNombre;
}
- (int)nombre
{
return nombre;
}
/*
- (void)drawRect:(NSRect)dirtyRect
{
//Drawing code here.
[monMonstre setImage:[NSImage imageNamed:@monstre.jpg]];
NSSize mSize = [monMonstre image].size;
NSRect monstreFrame;
monstreFrame = NSMakeRect(0.0f, [self nombre], mSize.width, mSize.height);
[monMonstre setFrame:monstreFrame];
[self addSubview:monMonstre];
[monMonstre release];
}
*/
@end
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bonjour,
peux-tu utiliser la balise code, c'est illisible sinon.
Merci
edit : Et te présenter aussi, dans la section approprié, (que l'on sache un peu qui tu es et ton niveau, pour que les réponses soit plus claire.)
Ca marche , j'avais pas vu le bouton
es-tu sur que ta méthode boutonClic: est bien appelé? (met un break point pour voir si tu passes dedans)
oui oui c'est appellé (j'ai mis un NSLog), c'est bizzard hein
(c'est trop marrant que soit de Caen: j'habite a Ifs ))
Tu as créé une deuxième instance de maVue dans le xib.
L'action du bouton est connectée à cette instance, et pas celle qui est dans la fenêtre.
(P.S. Je me rends régulièrement à Ifs).
woah ca marche
dingue, sans mentir, ca fait 3 jours que j'y suis donc...merci Céroce
en plus, c'est cool de la part d'un pro de passer un peu de temps sur ces forum (oui j'ai regarder tes sites)
bonne journée a tous ceux qui m'ont lu ! (a plus Alak!)
PS: en matiere de dev cocoa, tout se passe a Ifs.. c'est bien connu
En fait, comme tu avais donné le projet, j'ai pu trouver rapidement.
J'ai vu une deuxième instance de maView dans le xib et je l'ai supprimée.
Comme ça ne s'arrêtait plus dans la méthode d'action, j'ai compris tout de suite que l'action était liée à l'instance de maVue que je venais de supprimer.
J'ai fait pointer l'action sur la maVue de la fenêtre et ça fonctionnait. Problème réglé !
Mais parfois, je cherche aussi pendant des heures !
C'est normal de chercher, c'est le métier qui rentre. Quand on ne rencontre plus de difficultés dans son travail quotidien, ça veut dire qu'on ronronne et qu'il est temps de trouver de nouveaux défis, autrement on stagne techniquement.
Est-ce que le code ne devrait pas plutôt être dans un NSViewController ?
Non, une NSView est la bonne classe (la classe graphique en somme)
Disons, qu'il ne doit normalement y avoir d'IBActions que vers un contrôleur.
(après que ce soit NSViewController, NSWindowController, ou AppDelegate, peu importe à ce niveau).
Mettre un IBAction dans une NSView, ce n'est pas contraire au modèle MVC ? [EDIT]: Répondu par Céroce.
De plus, je vais continuer à pinailler, mais je pense que "nombre" devrait être un float et pas un int vu qu'il est utilisé dans un CGRect.
Le sujet aillant dévié, les discussions sur les int et CGRect se trouvent ici.