【问题标题】:Make a Cocoa application quit when the main window is closed?关闭主窗口时退出 Cocoa 应用程序?
【发布时间】:2010-05-28 02:29:08
【问题描述】:

如何让 Cocoa 应用程序在主窗口关闭时退出? 否则,您必须单击应用程序图标并在菜单中单击退出。

【问题讨论】:

  • 虽然这是一个有效的问题,但请重新考虑这样做。如果您的应用需要始终显示其主窗口,请禁用关闭它的功能。
  • 很公平,我会这样做的。谢谢!
  • 我不同意。在大多数单窗口应用程序中,包括计算器和(现在的)系统偏好设置,您可以关闭窗口,然后退出应用程序。而且我个人使用过相反的应用程序,当我试图关闭主窗口并听到哔声而不是我想要的关闭/退出时,我感到很沮丧。

标签: objective-c cocoa


【解决方案1】:

您可以实现 applicationShouldTerminateAfterLastWindowClosed: 以在您的应用程序的委托中返回 YES。但在这样做之前我会三思而后行,因为在 Mac 上除了计算器等小型“实用程序”应用程序之外,这真的很不寻常,而且大多数 Mac 用户不会欣赏你的应用程序表现得如此奇怪。

【讨论】:

  • 实际上,Apple 曾经拒绝过我的申请,并建议我执行此操作。他们说我需要一种清晰的方法来重新打开主窗口,或者实现“applicationShouldTerminateAfterLastWindowClosed”
  • @nute:嗯,是的,应该有一个简单的方法来重新打开一个窗口。您单击图标但没有任何明显反应的应用程序不是好的用户体验。这与说应用程序通常应该在最后一个窗口关闭时退出相去甚远。
  • 这并没有解决关闭主窗口时如何关闭应用程序的问题 - 这只解决了关闭最后一个窗口时的问题。
【解决方案2】:

将此代码 sn-p 添加到您应用的委托中:

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

【讨论】:

  • 你救了我的时间和生命!谢谢!!
【解决方案3】:

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

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

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

    // Your other application delegate methods ...

}

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

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

【讨论】:

  • Swift 3 要求发送者文本前有一个下划线和空格。
【解决方案4】:

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

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

如果这不起作用,您应该在您的 NSNotificationCenter 中添加一个观察者以获取通知NSWindowWillCloseNotification。不要忘记检查正确的窗口是否正在关闭。

【讨论】:

    【解决方案5】:

    这对我有用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多