Donner à ma classe (View) un accès à ma classe (Model)
Bonjour,
Je suis actuellement les cours de Stanford et j'en suis au premier TP nommée HelloPoly.
Je suis confronté au problème suivant , je n'arrive pas à donner à ma classe (View) un accès à ma classe (Model) PolygonShape.
Le .h de Controller
le .h de PolygonView
Dans IB j'ai fait les liaisons suivantes :
voir ficher joint.
Et lorsque dans le .m de PolygonView je fais un nslog pour voir ce qu'il en est, je contate qu'il créé à chaque fois une nouvelle instance de la classe PolygonShape lorsque que drawRect: est appelé.
Ca fait 3 jours que je bloque, commence à en avoir marre.
Je suis actuellement les cours de Stanford et j'en suis au premier TP nommée HelloPoly.
Je suis confronté au problème suivant , je n'arrive pas à donner à ma classe (View) un accès à ma classe (Model) PolygonShape.
Le .h de Controller
@interface Controller : NSObject {<br /> IBOutlet UIButton *decreaseButton;<br /> IBOutlet UIButton *increaseButton;<br /> IBOutlet UILabel *numberOfSidesLabel;<br /> IBOutlet PolygonView *polygonView;<br /> IBOutlet PolygonShape *polygon;<br />}[...]
le .h de PolygonView
@interface PolygonView : UIView {<br /> IBOutlet PolygonShape *polygon;<br />}<br />[...]<br />
Dans IB j'ai fait les liaisons suivantes :
voir ficher joint.
Et lorsque dans le .m de PolygonView je fais un nslog pour voir ce qu'il en est, je contate qu'il créé à chaque fois une nouvelle instance de la classe PolygonShape lorsque que drawRect: est appelé.
Ca fait 3 jours que je bloque, commence à en avoir marre.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Alors pour la méthode drawRect :
Appelée ici dans le .m de Controller :
LOG :
On voit bien que var numberOfSides reste toujours à 5 alors que polygon est bien incrémenté/décrémenté dans la classe Controller. C'est quoi si PolygonView faisait tout le temps une nouvelle instance de PolygonShape lorsque la méthode drawRect: est appelée .
Pour ton projet il y a une erreur :
error: UIKit/UIKit.h: No such file or directory dans CrazyJo_Prefix.pch, je ne la comprends pas.
Sinon tant qu'à faire voici mon projet :
Sans m'être attardé dessus , j'ai cru remarqué que tu inclémentes le nombre de face de ton polygon déclaré dans le controller.h, mais que la vue dessinait le polygon déclaré dans polygonView.h
Peut-être une piste ....
Cela signifie que tu n'as pas accès dans ton projet à <UIKit/UIKit.h> et que le #import <UIKit/UIKit.h> qui se trouve le fichier Prefix.pch ne peut aboutir.
[EDIT]C'est pas une erreur dans le projet, peut-être faut-il tout simplement régler le menu Active SDK (je dois être sous 3.0), au pire recharger les framework là où ils sont installés chez toi.
rq : Dans mon projet, il reste un warning sans importance pour le fonctionnement, mais cela n'a rien à voir avec l'erreur (grave) que tu signales ci-dessus. Cela n'empêche d'ailleurs pas le programme de fonctionner...
Tu connectes dans IB ton outlet polygon, et tu le redéfinis dans awakeFromNib. ce sont deux instances différentes qui sont vues par ton controller et ta vue PolygonView. Supprimes
polygon = [[PolygonShape alloc]initWithNumberOfSides:numberOfSidesLabel.text.integerValue minimumNumberOfSides:3 maximumNumberOfSides:12];
et ta vie recommencera à couler comme une rivière dans le Montana !
remarque: self.updateInterface cela marche, mais en ObjC, on écrit [self updateInterface]
Pour le self.updateInterface,
il me semble que pour les @property se soit autorisé, se serait même une des améliorations du "language". enfin je crois...
Question de méthode : tu as bien senti que cela coinçait au sujet de l'instance de PolygonShape. Dès lors, il aurait été plus facile de choisir le log NSLog(@%@",polygon) dans les actions des boutons afin d'analyser l'évolution des instances de PolygonShape créées. Je pense que tu en serais arrivé à la même conclusion que moi.
En l'occurence il ne s'agit pas d'une property mais de l'appel d'une méthode -(void) updateInterface;
self.updateInterface est une facilité syntaxique pour faire plaisir à ceux viennent du Java, ce n'est pas une amélioration. Autant les property sont considérées par certains comme une amélioration, et je suis plutôt dans cette catégorie, autant l'appel de méthodes ne gagne rien à cette écriture.
Question de goût peut-être, même si c'est moins clair, à taper c'est plus simple surtout dans la pénombre au lit avec quelqu'un qui dors à côté... lol.
Par contre, la notation point pour les méthodes est parfois intéressante dans l'utilisation des key-path.
Mais ... je ne voudrais pas te réveiller 8--) ::)
Certes sous le capot ça revient au même puisque l'accès à une propriété toto consiste à appeler le getter qui, par défaut, s'appelle du même nom que la propriété, à savoir "toto". Mais conceptuellement, c'est quand même pas super et pas uniforme avec les autres appels de méthodes prenant, eux, des paramètres...
Après, c'est sûr, ça marche, mais bon...
C'est ça !<br />
J'ai compris mon erreur : je ne savais pas qu'Interface Builder créait à nouveau une instance de PolygonShape du coup je comprends mieux la confusion qu'il y a eu entre les 2 instances.
Je vais maintenant pouvoir avancer plus loin dans le cours de Stanford.
Concernant la dot syntaxe merci pour la précision. J'admets que c'est nettement moins compréhensible lorsqu'il n'y a pas les [] lors de l'appels de méthodes.
[Edit] Nos messages se sont croisés, tu as donc trouvé la réponse...
Comment fonctionne IB pour que le PolygonShare *polygon de Controller et celui de PolygonView soient les mêmes, et non pas deux instances ?
Je vois bien la mise en place de la liaison dans IB, mais comment au final cela fonctionne t'il ? C'est plutôt une question d'Objective C pour le coup.
J'ai des siècles de programmation procédurale en C , mais de bien belles questions en Objective C...
C'est le B.A.BA de la programmation en liaison avec Interface Builder .
Et pourquoi ne pas en faire profiter a tout le monde ?
Merci AliGator. C'est donc la "désérialisation" du nib qui crée les instances et fait les liaisons.
Hop, attachée à ce message.
Ce qui est marrant c'est pas la différence mais plutôt la ressemblance, vous vous êtes inspiré de quelque chose ? Un des épisodes de Stanford ?
Oui.
Lecture 3 et 4 des cours de Stanford : http://www.stanford.edu/class/cs193p/cgi-bin/index.php 8--)
Oula quelle réponse ! Ca a l'air super complet, je vais lire ça immédiatement !
Merci à vous tous !
C'est un des exercices liés aux cours CS139P de Standford. Comme nous partons des mêmes cours, et de la même progression d'exercice en exercice, la ressemblance est en fait normale.
Pour les autres débutants en programmation iPhone, ces cours sont vraiment très bons, très progressifs. J'avais préalablement lu une grande partie du Zdziarski, mais il n'aborde pas du tout IB dans son livre.
Je vous livre la mienne dans quelques instants ...
- Une catégorie pour fabriquer le polygone régulier sous la forme d'un CGPathRef
- La suppression de tous ces va et vient entre des NSArray et des NSValue qui sont une perte de temps.
- La suppression de ce switch à 10 valeurs du case.
- La suppression de properties inutiles dans la classe PolygonShape.
- L'utilisation des fonctions sur les CGRect
...