2016-06-12 83 views
0

所有支持NSWindowRestoration的OS X应用程序都可以通过选择菜单项“退出并关闭所有窗口”(Option-Command Q)来关闭。这将禁用状态恢复,并且下次打开应用程序时,所有窗口都将处于其默认位置。如何以编程方式终止NSApp而不编码窗口状态?

菜单项触发NSApplication上的terminate:方法。但是常规的“关闭应用程序”菜单也是如此(命令Q)。

如何以编程方式“退出并关闭所有窗口”?我真的必须自己关闭所有窗户,然后致电terminate:

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

+0

为什么不直接在终止窗口循环并关闭它们? –

+0

@ l'L l因为这将是额外的代码来管理,而苹果有一个解决方案,与一个简单的方法调用。 – Klaas

回答

1

似乎并没有很好的方法来做到这一点。您可能希望提交Apple请求的错误(以及为什么需要它的解释)。

当两个动作连接到同一个terminate:方法时,苹果如何神奇地决定该怎么做?

好,看着了AppKit的拆卸,似乎-[NSApplication terminate:]检查,如果发件人是NSMenuItem一个实例。如果是,则检查其userInterfaceItemIdentifier是否等于@"NSAlternateQuitMenuItem"

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

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

+0

我不知道,NSMenuItem上有一个'userInterfaceItemIdentifier'属性。我只是在Objective-C中创建必要的接口定义来访问它。非常感谢! – Klaas

+0

一些进一步的调查提出,这是唯一的菜单项,得到这样的标识符。它最初不在那里,但在应用程序启动后一段时间自动添加。 – Klaas

+0

整个菜单项目不存在“最初”。它是在主菜单设置时由Cocoa创建的。如果您要依赖具有特定标识符的菜单项,这已经够糟糕的了。绝对不要把它作为唯一带有标识符的项目。 –

相关问题