2 votes

Fermeture des fenêtres enfants dans Cocoa lorsque la fenêtre principale est fermée

Je suis un débutant en Cocoa, il est donc probable que mon approche soit erronée, mais

J'ai une application qui ouvre plusieurs fenêtres enfant (après le chargement de la fenêtre principale/parentale) à l'aide de NSWindowController y initNibWIthName: . Cela fonctionne bien.

Mais lorsque je ferme la fenêtre parentale (en utilisant le x rouge), ces fenêtres restent ouvertes et empêchent l'application de se fermer tant qu'elles ne sont pas fermées elles aussi. C'est logique car je ne les ferme nulle part.

Mais comment faire ? Il doit y avoir un événement qui est appelé à ce moment-là, mais je ne le trouve nulle part.

Notifications telles que applicationWillTerminate (et ainsi de suite) ne sont appelées que lorsque l'application se termine réellement, et non lorsque le bouton de fermeture a été enfoncé.

Je pense que je cherche quelque chose de similaire à l'application Windows WM_CLOSE les messages de type.

4voto

Jeremy W. Sherman Points 22019

L'équivalent le plus proche que vous trouverez est le NSWindowWillCloseNotification affichée près de la fenêtre avant sa fermeture. Vous pouvez probablement faire en sorte que les fenêtres enfants se ferment elles-mêmes lorsque la fenêtre parentale se ferme en utilisant :

NSWindow *parentWindow;
NSArray *childWindows;

NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];
for (NSWindow *childWindow in childWindows) {
  [noteCenter
   addObserver:childWindow selector:@selector(close)
   name:NSWindowWillCloseNotification object:parentWindow];
}

Si la fenêtre enfant doit être désallouée avant son parent, veillez à la désinscrire des notifications avant que cela ne se produise.

La méthode de délégation mentionnée par Mark est une méthode de commodité pour le délégué qui lui évite de s'inscrire à une notification qu'il voudra probablement obtenir de toute façon. Il n'est pas nécessaire de créer un contrôleur de fenêtre pour recevoir ce message ; il suffit d'envoyer la fenêtre [window setDelegate:myObject] entraînera myObject pour recevoir le -windowWillClose: s'il répond à la méthode.

D'ailleurs, ce que Cocoa appelle "child Windows" est différent de ce à quoi vous pensez. Elles ne sont pas abordées dans le Guide de programmation des fenêtres mais si vous regardez la documentation des méthodes associées sur NSWindow Vous verrez qu'elles suivent les mouvements de leur fenêtre parente, de sorte qu'elles se déplacent en même temps qu'elle.

Si vous venez à Cocoa à partir de la programmation Win32, vous trouverez peut-être que le logiciel Apple's Portage sur Mac OS X à partir de l'API Win32 de Windows Il est utile de souligner les différences conceptuelles entre Win32 et Cocoa.

3voto

Mark Points 21191

2voto

Peter Hosey Points 66275

Windows et les applications ne sont pas la même chose dans Mac OS X.

Si vous avez une interface à fenêtre unique, avec une fenêtre principale et aucune autre à l'exception de À propos de, Préférences, etc. applicationShouldTerminateAfterLastWindowClosed: dans le délégué de votre application et renvoyer YES . C'est la seule façon (à part si vous le faites manuellement) pour que la fermeture d'une fenêtre entraîne la fermeture de l'application.

Si vous disposez d'une interface à fenêtres multiples (comme dans une application typique basée sur des documents), vous devez faire en sorte que toutes ces fenêtres soient homologues les unes des autres. Les fenêtres telles que les inspecteurs et les palettes d'outils doivent être des panneaux flottants, et non des fenêtres ordinaires. Et la fermeture de la dernière fenêtre ne devrait jamais, jamais, quitter une telle application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X