如何以编程方式终止NSApp而不编码窗口状态?

时间:2016-06-12 23:39:17

标签: macos state-restoration nswindowrestoration

可以通过选择菜单条目"退出并关闭所有Windows"来关闭所有支持NSWindowRestoration的OS X应用程序。 (选项 - 命令Q)。这会禁用状态恢复,下次打开应用程序时,所有窗口都将处于默认位置。

菜单条目触发terminate:上的NSApplication方法。但常规"关闭应用程序"菜单以及(命令Q)。

如何执行"退出并关闭所有Windows"以编程方式?我是否真的需要自己关闭所有窗口,然后拨打terminate:

当两个动作都连接到同一个terminate:方法时,Apple如何神奇地决定要做什么?

1 个答案:

答案 0 :(得分:1)

似乎没有很好的方法可以做到这一点。您可能想要提交Apple请求的错误(以及您需要解释的原因)。

  

当两个动作都连接到同一个terminate:方法时,Apple如何神奇地决定要做什么?

好吧,看看AppKit的反汇编,似乎-[NSApplication terminate:]检查发件人是否是NSMenuItem的实例。如果是,则检查其userInterfaceItemIdentifier是否等于@"NSAlternateQuitMenuItem"

我想,您可以使用该标识符创建一个虚拟菜单项,并将其作为发件人传递给-terminate:,但由于这依赖于实现细节,因此可能随时中断。

另一个控制因素是系统偏好设置>的设置。一般> “退出应用时关闭窗口”。这对应于用户默认密钥NSAlternateQuitMenuItem,但同样,这是一个实现细节。看来你可以在调用-terminate:之前设置它,然后在-applicationWillTerminate:委托方法中删除该设置。 (您的更改将与您的应用程序相关联。它们不会影响其他应用程序或“系统偏好设置”中的设置。)当然,您必须确保禁用突然终止以获取该委托方法调用。