在主窗口关闭时退出Cocoa应用程序?

Kri*_*oks 20 cocoa objective-c

如何在主窗口关闭时退出Cocoa应用程序?如果没有,您必须单击应用程序图标并单击菜单中的退出.

Chu*_*uck 28

您可以实现applicationShouldTerminateAfterLastWindowClosed:在应用程序的委托中返回YES.但是在做这个之前我会三思而后行,因为除了像计算器这样的小型"实用"应用程序外,它在Mac上非常不寻常,大多数Mac用户都不会欣赏你的应用程序如此奇怪.

  • 实际上,Apple曾经拒绝过我的申请,并建议我实施.他们说我需要一个明确的方法来重新打开主窗口,或者实现"applicationShouldTerminateAfterLastWindowClosed" (3认同)

Ste*_*eod 11

将此代码段添加到您应用的代理中:

-(BOOL) applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)app {
    return YES;
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*n R 8

由于问题主要是关于Cocoa编程而不是特定语言(Objective-C),这里是Swuck版本的Chuck和Steve的答案:

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

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

    // Your other application delegate methods ...

}
Run Code Online (Sandbox Code Playgroud)

对于Swift 3,将方法定义更改为

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
    return true
}
Run Code Online (Sandbox Code Playgroud)

  • 我本着元问题的精神添加了这个答案 [旧的 Objective-C 问题上的新 Swift 答案是否有益?](http://meta.stackoverflow.com/questions/303338/are-new-swift-answers-on -old-objective-c-questions-beneficial),并且因为我关闭了一个较新的问题,该问题明确要求 Swift 代码与此问题的重复。 (2认同)

pap*_*apr 6

你的主窗口应该有一个IBOutlet.例如:IBOutlet NSWindow*mainWindow;

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

如果这不起作用,您应该向NSNotificationCenter添加一个观察者,以获取Notification NSWindowWillCloseNotification.不要忘记检查右侧窗口是否关闭.