Créer une 2e fenetre : problème de liens

2»

Réponses

  • Merci pour cette info et bon courage à  toi aussi pour la rentrée
  • 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 :
    <br />
    - (IBAction)Click:(id)sender<br />
    {<br />
        deuxWindowController *FenetreSup=[[deuxWindowController alloc]initWithWindowNibName:@&quot;deuxWindowController&quot;];<br />
        [FenetreSup showWindow:(self)];<br />
    }<br />
    




    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


    <br />
    #import &lt;Cocoa/Cocoa.h&gt;<br />
    @interface deuxWindowController : NSWindowController<br />
    @property (assign) IBOutlet NSWindow *Win_Deux;<br />
    @end<br />
    




    et deuxWindowController.m


    <br />
    #import &quot;deuxWindowController.h&quot;<br />
    @interface deuxWindowController ()<br />
    @end<br />
    @implementation deuxWindowController<br />
    @synthesize Win_Deux;<br />
    - (id)initWithWindow:(NSWindow *)window<br />
    {<br />
        self = [super initWithWindow:window];<br />
        if (self) {<br />
    	    // Initialization code here.<br />
        }<br />
       <br />
        return self;<br />
    }<br />
    - (void)windowDidLoad<br />
    {<br />
        [super windowDidLoad];<br />
        NSLog(@&quot;Deuxieme&quot;);<br />
        // Implement this method to handle any initialization after your window controller&#39;s window has been loaded from its nib file.<br />
    }<br />
    @end<br />
    




    Le message "Deuxieme" s'affiche bien dans la console
  • Fred20Fred20 Membre
    octobre 2012 modifié #34
    Bonjour

    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 ?
  • 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 !



    Les fichiers d'App Delegate deviennent donc :



    .h


    <br />
    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification<br />
    {<br />
    	    deuxWindowController *FenetreSup=[[deuxWindowController alloc]initWithWindowNibName:@&quot;deuxWindowController&quot;];<br />
        [self setLaSeconde:FenetreSup];<br />
    }<br />
    - (IBAction)Click:(id)sender<br />
    {<br />
        [self.LaSeconde showWindow:(self)];<br />
    }<br />
    @end<br />
    




    et pour .m


    <br />
    #import &lt;Cocoa/Cocoa.h&gt;<br />
    #import &quot;deuxWindowController.h&quot;<br />
    @class deuxWindowController;<br />
    @interface AppDelegate : NSObject &lt;NSApplicationDelegate&gt;<br />
    @property (assign) IBOutlet NSWindow *window;<br />
    @property (strong) deuxWindowController *LaSeconde;<br />
    @end<br />
    




    J'arrive donc exactement à  ce que je voulais. Cela dit, même si ça marche, ce n'est peut être pas très orthodoxe ...
  • CéroceCéroce Membre, Modérateur
    Si c'est bien ainsi qu'il faut faire.

    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.
  • 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
    <br />
    -(void) fermerLaFenetre<br />
    {<br />
    [self.fenetreTertiaire dealloc]<br />
    super fermerLaFenetre<br />
    }<br />
    
  • L'objet NSWindow émet la notification NSWindowWillCloseNotification lors de la fermeture. En l'écoutant tu peux fermer les autres fenêtres liées.
  • Bonjour BertrandMartin,



    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.



    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 image/smile.png' class='bbc_emoticon' alt=':)' /> ] )





    Bonne continuation pour ton appli sur les tubes (300b, 845, ...)
Connectez-vous ou Inscrivez-vous pour répondre.