Wie kann eine Cocoa-Anwendung beendet werden, wenn das Hauptfenster geschlossen wird? Andernfalls müssen Sie auf das Symbol der Anwendung klicken und im Menü auf Beenden klicken.
Antworten
Zu viele Anzeigen?Sie können implementieren applicationShouldTerminateAfterLastWindowClosed:
um im Delegaten Ihrer Anwendung JA zurückzugeben. Aber ich würde es mir zweimal überlegen, bevor ich dies tue, da es auf dem Mac außerhalb von kleinen "Dienstprogrammen" wie Calculator sehr ungewöhnlich ist und die meisten Mac-Benutzer es nicht schätzen werden, wenn sich Ihre Anwendung so seltsam verhält.
Da sich die Frage hauptsächlich auf die Cocoa-Programmierung bezieht und nicht auf eine bestimmte Sprache (Objective-C) geht, ist hier die Swift-Version von Chucks und Steves Antwort:
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationShouldTerminateAfterLastWindowClosed(sender: NSApplication) -> Bool {
return true
}
// Your other application delegate methods ...
}
Für Mauersegler 3 ändern Sie die Methodendefinition in
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
Sie sollten ein IBOutlet zu Ihrem Hauptfenster haben. Zum Beispiel: IBOutlet NSWindow *mainWindow;
- (void)awakeFromWindow {
[mainWindow setDelegate: self];
}
- (void)windowWillClose:(NSNotification *)notification {
[NSApp terminate:self];
}
Wenn dies nicht funktioniert, sollten Sie Ihrem NSNotificationCenter einen Beobachter für die Benachrichtigung hinzufügen NSWindowWillCloseNotification . Vergessen Sie nicht zu prüfen, ob das rechte Fenster geschlossen ist.
Das funktioniert bei mir.
extension MainWindowController: NSWindowDelegate {
func windowWillClose(_ notification: Notification) {
if let window = notification.object as? NSWindow, let controller = window.windowController {
if window == self.window {
for window in self.childWindows {
print(" Closing \(window)")
window.close()
}
}
}
}
}