[Résolu] Sur le comportement lors de la fermeture d'une fenêtre.

LeeroyLeeroy Membre
octobre 2010 modifié dans API AppKit #1
Bonjour,

J'ai un problème avec le comportement lors de la fermeture d'une fenêtre. Dans le cadre d'une application qui n'est pas basée document (d'ailleurs c'est vrai aussi pour les applications basée document) lorsque qu'on clique sur le rond rouge, sur le menu fermer ou pomme-W cela ferme la fenêtre. Cela me mène à  deux questions :

1 -  Comment changer ce comportement pour que cela quitte le programme. Pour le menu et le raccourcie c'est facile mais pour le rond rouge ? J'ai regardé du coté de NSWindowDelegate avec la méthode willClose et j'ai tenté de forcer la fermerture avec un [NSApp terminate:self]; mais ça n'a rien donné. De plus je pense qu'il y a certainement un moyen plus simple et direct avec IB.

2 - Prenons le cas d'un projet Cocoa application vide. On compile ça ouvre la fenêtre mais si on la ferme rond rouge, menu fichier/fermer ou pomme W, impossible de la ré ouvrir (en cliquant sur l'icône dans le dock par exemple) pourtant la fenêtre est bien liée à  son contrôleur et dans IB la case released When closed est décoché, donc le fenêtre est encore en mémoire et pourrait revenir au premier plan. Je suppose qu'il faudrait que j'envoie le message show à  la fenêtre mais je suis étonné qu'il n'y ai rien de base.

Enfin tout ça pour dire que je trouve très étonnant qu'il n'y ai rien de base pour changer ce comportement simplement dans IB, ou alors j'ai raté un truc?

Réponses

  • mpergandmpergand Membre
    17:26 modifié #2
    Regarde du coté des méthodes déléguées de NSApplication:
    - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
    - (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender

    etc...


    [url=http://developer.apple.com/library/mac/#documentation/cocoa/Reference/NSApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/doc/uid/TP40008592-CH1-SW3NSApplicationDelegate Protocol Reference]NSApplicationDelegate Protocol Reference[/url]
  • octobre 2010 modifié #3
    Mais comme il le dit:
    Dans le cadre d'une application qui n'est pas basée document

    Donc je ne pense pas que "applicationShouldOpenUntitledFile" fonctionne. Mais peut-être que si.. la doc ne semble pas indiquer que la méthode n'est appelé qu'avec un document based app.


    Sinon, il faudrait aller avoir du côté de NSApplicationDelegate effectivement pour l'histoire de réouvrir la fenêtre en cliquant sur le Dock :
    <br />-(BOOL)applicationShouldHandleReopen:(NSApplication *)application hasVisibleWindows:(BOOL)flag<br />
    


    Et du côté de NSWindowDelegate pour capturer l'événement
    <br />- (void)windowWillClose:(NSNotification*)n<br />
    


    Comme c'est une notification, tu peux faire observer les fenêtres de ton choix par autant de controller que tu le souhaite. Ainsi "toto" pourrait observer la fenêtre de "tata" afin de relâcher "tata" une fois sa fenêtre fermée.

    Note que pour ton cas de quitter l'application, la méthode qui correspond le mieux est effectivement "applicationShouldTerminateAfterLastWindowClosed".. mais il arrive que l'on veuille quitter son application si la fenêtre principale se ferme, peut importe le nombre de fenêtre ouvertes (préférences... etc)
  • LeeroyLeeroy Membre
    17:26 modifié #4
    Pour le applicationShouldTerminateAfterLastWindowClosed ça fonctionne bien. Et mes autres fenêtre sont des NSPanel donc non comptabilisé comme des fenêtres pas de problème de ce coté.


    Par contre pour la réouverture ça marche pas. J'ai créer un projet Cocoa Application et j'ai modifié le AppDelegate qui est créé à  la base, j'ai justé ajouté ça dans le .m

    @implementation TestAppDelegate<br /><br />@synthesize window;<br /><br />- (void)applicationDidFinishLaunching:(NSNotification *)aNotification <br />{<br />	[NSApp setDelegate:self];<br />}<br /><br />-(BOOL)applicationShouldHandleReopen:(NSApplication *)application hasVisibleWindows:(BOOL)flag<br />{<br />	return YES;<br />}<br />@end
    


    J'ai bien vérifier la variable window et bien liée à  la fenêtre et dans IB la case released When closed est décoché.  Mais j'ai un doute sur cette fonction... Dans la doc on peut lire
    By default the Application Kit will handle this event by checking whether there are any visible NSWindow (not NSPanel) objects, and, if there are none, it goes through the standard untitled document creation (the same as it does if theApplication is launched without any document to open). For most document-based applications, an untitled document will be created.


    Donc j'ai l'impression que cette fonction ne marche que pour le document-based mais il n'y a aucun autre équivalent.

    Notez que pour un NSPanel, pour ré afficher, je dois juste renvoyer un show à  la fenêtre.  Mais la j'ai pas encore trouvé ou mettre ça dans le cas de la fenêtre principal....
  • 17:26 modifié #5
    ça t'empêches de rajouter [myWindow makeKeyAndOrderFront:nil]; dans la méthode?  :o

    <br />-(BOOL)applicationShouldHandleReopen:(NSApplication *)application hasVisibleWindows:(BOOL)flag<br />{<br />	[myWindow makeKeyAndOrderFront:nil]; <br />	return YES;<br />}<br />
    
  • LeeroyLeeroy Membre
    17:26 modifié #6
    En effet ça fonctionne. Mais je pensais que la méthode déléguée n'était appelée qu'une fois pas à  chaque fois.

    Merci beaucoup.

    PS je ne connaissais pas cette fonction.. En fait je dois pas en connaitre plus d'une vingtaine  :P je débute. Mais merci de m'expliquer clairement  :)
Connectez-vous ou Inscrivez-vous pour répondre.