Accès classe et modification de variables
Bonjour .
J'ai commencé à faire du "dessin" sur l'iPhone et j'ai un petit souci qui se présente.
J'ai créer un nouveau projet de type 'Window base application'. Je créé une nouvelle classe : maVue.
En voici le code.
.h
.m
puis dans mon Controller j'aimerai choisir mes x,y et les transmettre à ma classe maVue .
Voici le code de mon Controller :
Problème, mon cercle se dessine très bien mais apparait aux coordonnées (0,0) alors que je lui ai dit de se mettre en (200,200) .
Pourquoi ça ne marche pas?
Je pense que c'est une erreur stupide mais je comprends pas ...
Merci .
J'ai commencé à faire du "dessin" sur l'iPhone et j'ai un petit souci qui se présente.
J'ai créer un nouveau projet de type 'Window base application'. Je créé une nouvelle classe : maVue.
En voici le code.
.h
<br />@interface maVue : UIView {<br /> NSInteger x;<br /> NSInteger y;<br /><br />}<br />@property(nonatomic,assign) NSInteger x;<br />@property(nonatomic,assign) NSInteger y;<br />@end<br />
.m
<br />@implementation maVue<br />@synthesize x,y;<br /><br />- (void)drawRect:(CGRect)rect {<br /> CGContextRef context = UIGraphicsGetCurrentContext();<br /> CGContextSetRGBFillColor(context, 100, 55, 169, 1);<br /> CGContextFillEllipseInRect(context, CGRectMake(x, y, 36, 36));<br /><br />}<br />
puis dans mon Controller j'aimerai choisir mes x,y et les transmettre à ma classe maVue .
Voici le code de mon Controller :
<br />- (void)viewDidLoad {<br /> [super viewDidLoad];<br /> maVue *cont = [[maVue alloc] init];<br /> cont.x = 80;<br /> cont.y =60;<br />}<br />
Problème, mon cercle se dessine très bien mais apparait aux coordonnées (0,0) alors que je lui ai dit de se mettre en (200,200) .
Pourquoi ça ne marche pas?
Je pense que c'est une erreur stupide mais je comprends pas ...
Merci .
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Normalement il y a cast automatique, mais c'est pas optimisé et ça peut être un vecteur de bugs.
Voici ma fonction :
Cela ne peut pas marcher
1) parce que les dessins se font dans -(void) drawRect:(CGRect) rect (sauf exception qui nécessite d'utiliser un CGContext
2) parce qu'il y a de fortes chances que cette méthode ne soit pas appelée , enfin cela dépend de ta manière de charger le système viewcontroller/view. Pour préciser, si la vue est dans un xib, initWithFrame n'est pas appelée.
Dans la méthode générale de chargement via un xib personnalisé, c'est viewDidLoad qui est appelée pour compléter l'initialisation, ou loadView si aucune vue n'est définie pour le contrôleur, et dans ce dernier cas, il faut tout faire par code :
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/
/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
  [super viewDidLoad];
}
*/
Mais il ne connait pas frame
Une petite recherche Google me donne des codes du genre :
C'est pas ça que tu cherches ?
Si je mets ta ligne de code je ne peux plus acceder aux variables de ma classes "maVue".
À demander à la vue de se re-dessiner (complètement ou en partie)
Bah j'ai essayer de mettre
[maVue setNeedsDisplay:YES];
dans viewdidload mais là plus rien ne charge.
"maVue may not respond to +setNeedsDisplay"
Bon ca compile très bien et tout se charge correctement mais mon cercle reste toujours en (0,0) .
Là sans avoir plus d'information sur ton code, c'est difficile
En relisant ce qui précède, il me semble que tu espères un repositionnement avec :
cont.x = 80;
cont.y =60;
Si c'est cela,
1) Les properties x devraient être en CGFloat parce que c'est comme cela que ça se fait dans les kits Apple, et donc plutôt
cont.x = 80.0;
cont.y =60.0;
2) au minimum, un setNeedsDisplay après le changement de ces valeurs. Personnellement, je ferais un setter personnalisé dans le code de MaVue:
-(void) setX:(CGFloat) CGFloat anX {
x=anX;
[self setNeedsDisplay];
}
idem en setY
Je mettrais un NSLog("%.2f",x); dans ces setter pour voir si tout marche bien.
Et si le cercle s'obstine à rester en (0,0) je regarederais le code dans la méthode drawRect pour voir si d'aventure il n'y a pas là quelqu'erreur ...
Je vais essayer le point 2.
Par contre une fois ta fonction setX ecrite. Tu l'appelles où ?
ps: tu n'aurai pas mis CGFloat en double dans le prototype de ta fonction ^^
ça m'étonne cette vue allouée au milieu de nulle part et affectée à rien comme ça.
Enfin faut que tu revoies un peu le système d'allocations des vues et objets d'interface je crois :P
ça, c'est pas une méthode de "maVue" quand même ?!
Si oui, je crois que tu mélanges un peu tout...
Essaie ça, ça devrait aller mieux :
Meme si pour vérifier je prends ton code ça marche pas.
Enfin je pense pas m'être trompé sur ça.. enfin j'espère.
Si quelqu'un veut mon projet pour jeter un coup d'oeil ...
Et il y a effectivement une maVue dans le xib + une créée dans viewDidLoad. Il faut choisir entre un procédé ou l'autre, mais pas faire les deux.
Le plus simple serait de supprimer de supprimer le code d'initialisation dans viewDidLoad, de crééer un IBOutlet et de le connecter dans IB.
Enfin dans la méthode -(void)viewDidAppear paramétrer ton dessin
-(void)viewDidAppear :(BOOL) animated{
cont.x = 80.0;
cont.y = 60.0;
[cont setNeedsDisplay];
}
ps : en supprimant le Build des dossiers compressés, on réduit considérablement la taille des fichiers transmis, merci
Merci beaucoup philippe.
Comme ca je peux dragger mon cercle avec touchesMoved cest cool.
Dsl pour les build ::)
Ce qui m'a fait tiquer, c'est que dans ce code, la vue allouée ne pouvait être utilisée par personne ! (c'est d'ailleurs un pur leak...)