Bon, je vais taper un peu l'incruste dans ce post. Mon problème actuel est d'ouvrir des fenêtres secondaires. J'ai donc fait un essai :
Création d'un nouveau projet,puis ajout d'un fichier supplémentaire (Classe Objective C NSWindowController) nommé deuxWindowController. XCode m'a donc créé 3 fichiers : deuxWindowController.h , deuxWindowController.m et deuxWindowController.xib . J'ai ensuite ajouté un bouton dans la fenêtre de MainMenu.xib puis une méthode pour ce bouton :
Regarde l'exemple au dessus sachant que dans le .h de la classe de la fenetre tu devras mettre id delegMyDocumentPourPtDigit (ou son équivalent en fonction de comment tu l'as appelé) sous @interface
Sinon, est ce que file's owner est bien relié à ta fenetre ?
J'ai trouvé une autre solution, en réfléchissant un peu. Un pointeur sur un objet est créé dans la méthode événementielle. Cependant, ce pointeur n'est que local, sa portée est limitée à la méthode. Donc, dès que la méthode est terminée, l'objet est déchargé et la fenêtre disparaà®t. J'ai donc ajouté une propriété forte à App Delegate : un objet de classe deuxWindowController. Puis, après avoir créé l'objet, je l'ai affecté à cette propriété. Résultat : ça marche impeccablement bien !
C'est parfait. Donc, allons plus loin : Avec le même principe, on peut créer une fenêtre tertiaire, lancée par un bouton dans une fenêtre secondaire. C'est ce qui se passe dans mon programme d'électronique : On a la fenêtre primaire, avec des boutons pour lancer des fenêtre secondaires, affectées à un chapitre particulier, et sur certaines, la possibilité de lancer un panneau optionnel, qui précise certaines choses sur le sujet en cours de calcul. Seulement, si on ferme la fenêtre secondaire, la fenêtre tertiaire est toujours là ! La question est, existe-t-il une méthode automatiquement invoquée à la fermeture d'une fenêtre, ne figurant pas par défaut dans les fichiers .h et .m, que l'on pourrait réécrire de type
Il existe plusieurs façons de gérer des fenêtres par groupe dans Cocoa.
NSDocument
Il est possible d'ouvrir plusieurs fenêtre pour un même document.
Il faut d'abord définir la fenêtre principale, généralement à l'ouverture du document:
<br />
- (void)windowControllerDidLoadNib:(NSWindowController *) aController<br />
{<br />
[super windowControllerDidLoadNib:aController];<br />
[aController setShouldCloseDocument:YES]; // permet de fermer toutes les fenêtres du document<br />
Et on ajoute une fenêtre avec la méthode addWindowController: de NSDocument
La fermeture de la fenêtre principale entraine la fermeture de toutes les fenêtres du document.
Ces fenêtres sont attachées à la fenêtre parente, cà d qu'elles se déplacent avec celle-ci.
La fermeture de la fenêtre parente entraine la fermeture des fenêtre enfants, l'inverse n'étant pas/plus vrai ( à partir de 10.7 [ it's not a bug, it's a feature /smile.png' class='bbc_emoticon' alt=':)' /> ] )
Bonne continuation pour ton appli sur les tubes (300b, 845, ...)
Réponses
Création d'un nouveau projet,puis ajout d'un fichier supplémentaire (Classe Objective C NSWindowController) nommé deuxWindowController. XCode m'a donc créé 3 fichiers : deuxWindowController.h , deuxWindowController.m et deuxWindowController.xib . J'ai ensuite ajouté un bouton dans la fenêtre de MainMenu.xib puis une méthode pour ce bouton :
l'application se lance bien, quand je clique sur ce bouton, la fenêtre secondaire s'ouvre ... Pour aussitôt se refermer ! Que dois-je faire ?
voici le code de ces fichiers .h et .m :
deuxWindowController.h
et deuxWindowController.m
Le message "Deuxieme" s'affiche bien dans la console
Tu as oublié le délégué sur la fenetre :
Regarde l'exemple au dessus sachant que dans le .h de la classe de la fenetre tu devras mettre id delegMyDocumentPourPtDigit (ou son équivalent en fonction de comment tu l'as appelé) sous @interface
Sinon, est ce que file's owner est bien relié à ta fenetre ?
Les fichiers d'App Delegate deviennent donc :
.h
et pour .m
J'arrive donc exactement à ce que je voulais. Cela dit, même si ça marche, ce n'est peut être pas très orthodoxe ...
Si la propriété est weak, alors le NSWindowController n'est retenu par aucun objet, alors à la fin du cycle, il est libéré par l'autorelease pool.
P.S.: Par convention, les noms de classes commencent par des majuscules, les noms de variables par des minuscules.
Il existe plusieurs façons de gérer des fenêtres par groupe dans Cocoa.
NSDocument
Il est possible d'ouvrir plusieurs fenêtre pour un même document.
Il faut d'abord définir la fenêtre principale, généralement à l'ouverture du document:
Et on ajoute une fenêtre avec la méthode addWindowController: de NSDocument
La fermeture de la fenêtre principale entraine la fermeture de toutes les fenêtres du document.
Child window
Une fenêtre peut avoir des fenêtres enfants
[font=courier new,courier,monospace]- (void)addChildWindow:(NSWindow *)childWindow ordered:(NSWindowOrderingMode)orderingMode[/font]
Ces fenêtres sont attachées à la fenêtre parente, cà d qu'elles se déplacent avec celle-ci.
La fermeture de la fenêtre parente entraine la fermeture des fenêtre enfants, l'inverse n'étant pas/plus vrai ( à partir de 10.7 [ it's not a bug, it's a feature /smile.png' class='bbc_emoticon' alt=':)' /> ] )
Bonne continuation pour ton appli sur les tubes (300b, 845, ...)