Afficher/rafraà®chir une NSView en cliquant sur bouton
6ix
Membre
Salut tout le monde,
Je suis relativement débutant avec cocoa, et là je dois dire que je ne trouve nulle part ce que je voudrais...
En fait, j'ai une sous-classe de NSView, qui dessine plusieurs segments regroupés dans une liste; il est possible depuis la GUI de définir le nombre de segments, puis il faut cliquer sur un bouton pour construire et afficher la View.
Je ne trouve aucun exemple, tuto, discussion,... sur le sujet, et cela me serait bien utile, car j'ai quelques petits problèmes!
Du style:
- la méthode drawRect est (si j'ai bien compris) appelée dès l'ouverture de l'application; comment faire pour qu'elle ne le soit qu'au clic sur le bouton (pour n'afficher la vue qu'à ce moment-là )?
- je rencontre des difficultés pour faire le lien entre la classe controller et la sous-classe de view; la classe controller contient la méthode draw() appelée au clic du bouton qui récupère le nbre de segments et rafraà®chit ensuite la View, qui a besoin dans drawRect du nombre de segments
Je le fais en Java, mais aucun problème si les exemples ou tutos sont en Obj-C (j'adapterai...). Toute aide sera la bienvenue!
Je suis relativement débutant avec cocoa, et là je dois dire que je ne trouve nulle part ce que je voudrais...
En fait, j'ai une sous-classe de NSView, qui dessine plusieurs segments regroupés dans une liste; il est possible depuis la GUI de définir le nombre de segments, puis il faut cliquer sur un bouton pour construire et afficher la View.
Je ne trouve aucun exemple, tuto, discussion,... sur le sujet, et cela me serait bien utile, car j'ai quelques petits problèmes!
Du style:
- la méthode drawRect est (si j'ai bien compris) appelée dès l'ouverture de l'application; comment faire pour qu'elle ne le soit qu'au clic sur le bouton (pour n'afficher la vue qu'à ce moment-là )?
- je rencontre des difficultés pour faire le lien entre la classe controller et la sous-classe de view; la classe controller contient la méthode draw() appelée au clic du bouton qui récupère le nbre de segments et rafraà®chit ensuite la View, qui a besoin dans drawRect du nombre de segments
Je le fais en Java, mais aucun problème si les exemples ou tutos sont en Obj-C (j'adapterai...). Toute aide sera la bienvenue!
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Non, drawRect est appelé à chaque fois que la vue nécessite un réaffichage.
Tu peux "manuellement" forcer le réaffichage de cette vue via la méthode setNeedsDisplay(true).
Donc en mettant cette méthode dans le code de ton bouton, ça rafraà®chira la vue.
Normalement, tu devrais avoir un outlet entre ton contrôleur et ton custom-view. C'est ça le lien.
.
Oui effectivement, et j'en ai un. Il faudrait que je développe un peu plus, alors voilà mon code, avec les 2 classes en question:
Un clic appelle draw(), qui va modifier le modèle (voir classe ci-dessous) et réafficher la View
J'ai une erreur "Cannot find symbol", c'est peut-être tout con, mais vu que j'ai pas trop l'habitude...
Si vous connaissez des exemples ou tutos d'une vue réagissant au clic d'un bouton, je suis preneur, je n'en trouve pas, et ça évite les coups d'essais peu méthodiques!
Par contre, il faut dans le fichier de la classe MazeController "importer" la classe mazeView pour que le vérificateur Java puisse lier correctement la méthode setModel.
Je n'ai jamais fait de Java sous cocoa, mais je pense qu'un import MazeController devrait suffir.
Là est une des limites de Java par rapport à Objective-C : le dynamisme.
Le même programme en Obj-C aurait compilé normalement (mais avec un warning indiquant que la méthode setModel n'est pas connue).
.
Drawing contient donc la liste de segments, Segment étant juste définie par deux points.
C'est la 1e pour moi aussi en fait; j'essaie de refaire sous cocoa un programme crée avant en java pur.
Le import n'est pas reconnu; j'ai essayé plusieurs trucs, mais il prend pas... Je n'ai pas défini de package, mais peut-être Xcode en crée un par défaut, qu'il faut ajouter avant le nom de la classe?
Mais pourquoi devrais-je importer la classe MazeView, si ma mazeView est déjà déclarée dans le MazeController (NSView mazeView;)? D'ailleurs, je ne rencontre pas de problème sur le mazeView.setNeedsDisplay(true);
Dans MazeController, ma vue était déclarée comme ceci:
NSView mazeView; //IB Outlet
J'ai changé en:
MazeView mazeView;, étant donné que MazeView hérite de NSView.