【问题标题】:How to make an application quit when its last window is closed before 10.6如何在 10.6 之前关闭最后一个窗口时让应用程序退出
【发布时间】:2011-09-19 21:07:04
【问题描述】:

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

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

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

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

谁能帮帮我?提前致谢。

【问题讨论】:

    标签: cocoa osx-leopard


    【解决方案1】:

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

    这与您是否声明符合该协议无关(该协议在早于 10.6 的 SDK 中不作为正式协议存在,这就是您无法使用它的原因)。

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

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

    为此,请从 NSApplication 委托协议中实现一个方法。

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

    您需要应用程序的代理通过返回YES 来响应applicationShouldTerminateAfterLastWindowClosed:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      相关资源
      最近更新 更多