【问题标题】:How to handle Cocoa application termination properly?如何正确处理 Cocoa 应用程序终止?
【发布时间】:2012-04-30 17:38:47
【问题描述】:

所以,这是我的情况:

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

我最初的想法是:

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

所以,我决定以委托方式进行。

在我的应用程序委托中,我实现了:

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

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

  • 如果不存在修改过的文档,则返回NSTerminateNow
  • 如果有修改过的文档,返回NSTerminateCancel。在这种情况下,弹出一个警告表或类似的东西,如果用户确认他想退出,然后打电话给[NSApp terminate:nil];

这是正确的做法吗?

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    确实是这样。但是在您的applicationShouldTerminate 实现中,您应该在此处弹出警报,如果用户没有单击取消,则返回NSTerminateNowNSTerminateCancel 否则。以后无需手动终止应用程序。

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

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

    【讨论】:

    • 好主意;但是,这是我用于 YES-NO 警报表 (snippet.mx/Ra8E) 的代码。我该怎么做才能让它在同一个函数中返回?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2011-06-28
    • 2010-11-30
    相关资源
    最近更新 更多