cocoa - 10.6 之前如何让应用程序在最后一个窗口关闭时退出

标签 cocoa osx-leopard

我正在尝试创建一个需要面向 Mac OS X 10.5 的 Cocoa 应用程序。我创建了一个新的 Cocoa 应用程序,它会自动为我生成第一个表单。

如果我构建,它将运行良好,直到我将基础 SDK 更改为 10.5,此时构建失败并显示“找不到 NSApplicationDelegate 的协议(protocol)声明”。

现在,我知道 NSApplicationDelegate 是 10.6 的一个功能。我搜索并发现其他人只是说删除 NSApplicationDelegate 协议(protocol)。我这样做了,它将构建并运行,但我无法让应用程序退出。如果我单击红色按钮关闭窗口,它会关闭,但停靠图标仍然存在。

我怀疑这与表单未获取/处理退出事件有关;然而,我是 Xcode 新手,所以我不确定窗口代码应该是什么样子,而且事实证明,找到 10.5 的示例源代码很棘手。

有人可以帮助我吗?提前致谢。

最佳答案

Now, I know that NSApplicationDelegate was a 10.6 feature. I've searched and found others who simply say to remove the NSApplicationDelegate protocol. I do that and it will build and run, but I can't get the app to exit. If I click the red button to close the window, it closes but the dock icon remains.

这与您是否声明遵守该协议(protocol)无关(该协议(protocol)在 10.6 之前的 SDK 中不作为正式协议(protocol)存在,这就是您无法使用它的原因)。

在 Mac 上,窗口和应用程序是两个不同的事物,因此关闭窗口和退出应用程序同样是两个不同的事物。应用程序拥有自己的窗口,因此退出应用程序将关闭其所有窗口(但是,如果应用程序支持 Lion 的状态恢复功能,则它们将在应用程序下次启动时返回)。关闭窗口不会退出应用程序。

但是,对于单窗口应用程序,关闭应用程序的主窗口以退出应用程序确实有意义。系统偏好设置和许多其他单窗口应用程序证明了这一点。

为此,请实现 NSApplication 委托(delegate)协议(protocol)中的方法。

注意我写的方式。该协议(protocol)在 10.6 之前并不是正式协议(protocol),但它仍然存在,如 an informal protocol 。你不能声明与它的一致性,但你仍然可以实现它的方法,并且 NSApplication 仍然会发送它的委托(delegate)委托(delegate)消息。

您需要应用程序的委托(delegate)通过返回 YES 来响应 applicationShouldTerminateAfterLastWindowClosed:

关于cocoa - 10.6 之前如何让应用程序在最后一个窗口关闭时退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7477298/

相关文章:

iphone - 平行阵列

objective-c - Core-data : when accessing a relationship, NSSet 上的计数方法失败

xcode - 如何使 10.6 中制作的 Mac 应用程序在 10.5 中运行

objective-c - 在编译多个版本时,如何包含对仅在一个操作系统版本中存在的方法的调用?

python - 为 Leopard 和 Snow Leopard 编译 py2app 工作版本?

swift - 初始化需要 `init(coder: NSCoder)`的子类

objective-c - 如何在 cocoa 中运行 shell 命令并获取输出?

php - 如何在 Mac OS X 10.5 Leopard 上设置 PEAR

cocoa - 让 "LightTable"示例代码正常工作