2010-05-28 7 views
16

Sans cela, vous devez cliquer sur l'icône de l'application et cliquez sur Quitter dans le menu.Une application Cocoa se ferme-t-elle lorsque la fenêtre principale est fermée? Comment faire pour fermer une application Cocoa lorsque la fenêtre principale est fermée?

+2

Bien que ce soit une question valide, reconsidérer le faire. Si votre application doit toujours avoir sa fenêtre principale, désactivez-la à la place. –

+1

Assez juste, je le ferai. Je vous remercie! –

+13

Je ne suis pas d'accord. Dans la plupart des applications à fenêtre unique, y compris la Calculatrice et (de nos jours) les Préférences Système, vous êtes autorisé à fermer la fenêtre, ce qui entraîne la fermeture de l'application. Et j'ai personnellement utilisé des applications qui sont allées dans l'autre sens, et j'ai été frustré quand j'ai essayé de fermer la fenêtre principale et j'ai reçu un bip au lieu de la fermeture/arrêt que je voulais. –

Répondre

23

Vous pouvez implémenter applicationShouldTerminateAfterLastWindowClosed: pour renvoyer YES dans le délégué de votre application. Mais je penserais à deux fois avant de faire cela, car c'est vraiment inhabituel sur le Mac en dehors des petites applications "utilitaires" comme la Calculatrice et la plupart des utilisateurs de Mac n'apprécieront pas que votre application se comporte si étrangement.

+3

En fait, Apple a rejeté ma demande une fois et m'a suggéré de l'implémenter. Ils ont dit que j'avais besoin d'une manière claire de rouvrir la fenêtre principale, ou d'implémenter "applicationShouldTerminateAfterLastWindowClosed" –

+1

@nute: Eh bien, oui, il devrait y avoir un moyen facile de rouvrir une fenêtre. Une application où vous cliquez sur l'icône et rien d'apparent n'arrive n'est pas bon UX. C'est loin de dire que les applications en général devraient se fermer quand la dernière fenêtre se ferme. – Chuck

6

Vous devez avoir un IBOutlet dans votre fenêtre principale. Par exemple: IBOutlet NSWindow * mainWindow;

- (void)awakeFromWindow { 
    [mainWindow setDelegate: self]; 
} 
- (void)windowWillClose:(NSNotification *)notification { 
    [NSApp terminate:self]; 
} 

Si cela ne fonctionne pas, vous devez ajouter un observateur à votre NSNotificationCenter pour la notification NSWindowWillCloseNotification. Ne pas oublier de vérifier si la fenêtre de droite se ferme.

10

Ajouter cet extrait de code à votre délégué de l'application:

-(BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app { 
    return YES; 
} 
4

La question est principalement sur la programmation Cocoa et non d'une langue spécifique (Objective-C), voici la version Swift de Chuck et Steve réponse:

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

    func applicationShouldTerminateAfterLastWindowClosed(sender: NSApplication) -> Bool { 
     return true 
    } 

    // Your other application delegate methods ... 

} 

pour Swift 3 changement de la définition de méthode pour

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 
    return true 
} 
+1

J'ai ajouté cette réponse dans l'esprit de la question méta [Les nouvelles réponses de Swift sur les anciennes questions Objective-C sont-elles bénéfiques?] (Http://meta.stackoverflow.com/questions/303338/are-new-swift-answers- sur-vieux-objectif-c-questions-bénéfique), et parce que j'ai fermé une nouvelle question demandant explicitement le code Swift comme doublon de celui-ci. –

+0

Swift 3 nécessite un trait de soulignement et un espace avant le texte de l'expéditeur. – dylan

+0

@dylan: Oui, merci! –

Questions connexes