如何正确处理Cocoa应用程序终止?

时间:2012-04-19 08:16:46

标签: objective-c cocoa terminate nsapplication nsapplication-delegate

所以,这是我的情况:

我正在开发一个非标准的基于文档的应用程序,我想处理在任何文档中仍有未保存的更改时中止终止的情况。

我最初的想法是:

  • 用户尝试退出应用程序(通过"Quit XXXXX"菜单项或点击"X"按钮)
  • 是否有任何修改过的文件?
  • 如果否:退出
  • 如果是:通知用户有未修改的文档。如果他想继续,那么退出。否则取消终止。

所以,我决定以委托方式来做。

在我的应用程序代理中,我实现了:

  • -windowToClose:(在NSWindowWillCloseNotification上触发)
  • applicationShouldTerminate:
  • applicationShouldTerminateAfterLastWindowClosed:

现在,这就是我的想法。在applicationShouldTerminate:方法中:

  • 如果没有修改过的文档,则返回NSTerminateNow
  • 如果有修改过的文件,请返回NSTerminateCancel。在这种情况下,弹出警报表或类似的东西,如果用户确认他想要退出,则拨打[NSApp terminate:nil];

这是正确的方法吗?

有什么建议吗?

1 个答案:

答案 0 :(得分:7)

确实如何做到这一点。但是在applicationShouldTerminate实现中,您应该只在那里弹出警报,如果用户没有单击取消,则返回NSTerminateNow;否则NSTerminateCancel。无需稍后手动终止该应用程序。

编辑:要将警报显示为工作表但将其作为模式对话框运行,请在警报上调用beginSheetModalForWindow,然后调用[NSApp runModalForWindow:alert]。此外,在为beginSheetModalForWindow传递的结束选择器中,您需要调用[NSApp stopModal]以退出模态循环。

但是,在这种情况下,最好将警报作为窗口的工作表运行,并在NSTerminateLater实现中返回applicationShouldTerminate。然后,在警报的结束选择器中,调用[NSApp replyToApplicationShouldTerminate:]。这就是Apple建议您实现此目的的方式。