26 Stimmen

Soll eine Cocoa-Anwendung beendet werden, wenn das Hauptfenster geschlossen wird?

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.

34voto

Chuck Punkte 228137

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.

17voto

Steve McLeod Punkte 50514

Fügen Sie diesen Codeschnipsel zum Delegaten Ihrer Anwendung hinzu:

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

10voto

Martin R Punkte 510450

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
}

8voto

papr Punkte 4617

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.

0voto

Duncan Groenewald Punkte 7788

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()

                }

            }
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X