如何在不编码 window 状态的情况下以编程方式终止 NSApp?
How to programmatically terminate NSApp without encoding window state?
所有支持 NSWindowRestoration
的 OS X 应用程序都可以通过选择菜单项 "Quit and Close All Windows"(Option-Command Q)来关闭。这会禁用状态恢复,下次您打开应用程序时,所有 windows 都将处于默认位置。
菜单项触发 NSApplication
上的 terminate:
方法。但常规 "Close App" 菜单也是如此(命令 Q)。
如何以编程方式执行 "Quit and Close All Windows"? 我真的必须自己关闭所有 windows 然后调用 terminate:
吗?
当两个操作都连接到同一个 terminate:
方法时,Apple 如何神奇地决定要做什么?
似乎没有很好的方法来做到这一点。您可能希望通过 Apple 请求提交错误(以及您需要它的原因的解释)。
How does Apple magically decide what to do, when both actions are connected to the same terminate:
method?
嗯,看看 AppKit 的反汇编,似乎 -[NSApplication terminate:]
检查发送者是否是 NSMenuItem
的实例。如果是,它会检查它的 userInterfaceItemIdentifier
是否等于 @"NSAlternateQuitMenuItem"
.
我想,您可以创建一个带有该标识符的虚拟菜单项,并将其作为发送者传递给 -terminate:
,但由于这依赖于实现细节,它可能随时会中断。
另一个控制因素是系统偏好设置 > 通用 > "Close windows when quitting an app" 的设置。这对应于用户默认键 NSAlternateQuitMenuItem
,尽管这又是一个实现细节。看来您可以在调用 -terminate:
之前设置它,然后在 -applicationWillTerminate:
委托方法中删除该设置。 (您的更改将与您的应用程序相关联。它们不会影响其他应用程序或系统偏好设置中的设置。)当然,您必须确保禁用突然终止才能调用该委托方法。
所有支持 NSWindowRestoration
的 OS X 应用程序都可以通过选择菜单项 "Quit and Close All Windows"(Option-Command Q)来关闭。这会禁用状态恢复,下次您打开应用程序时,所有 windows 都将处于默认位置。
菜单项触发 NSApplication
上的 terminate:
方法。但常规 "Close App" 菜单也是如此(命令 Q)。
如何以编程方式执行 "Quit and Close All Windows"? 我真的必须自己关闭所有 windows 然后调用 terminate:
吗?
当两个操作都连接到同一个 terminate:
方法时,Apple 如何神奇地决定要做什么?
似乎没有很好的方法来做到这一点。您可能希望通过 Apple 请求提交错误(以及您需要它的原因的解释)。
How does Apple magically decide what to do, when both actions are connected to the same
terminate:
method?
嗯,看看 AppKit 的反汇编,似乎 -[NSApplication terminate:]
检查发送者是否是 NSMenuItem
的实例。如果是,它会检查它的 userInterfaceItemIdentifier
是否等于 @"NSAlternateQuitMenuItem"
.
我想,您可以创建一个带有该标识符的虚拟菜单项,并将其作为发送者传递给 -terminate:
,但由于这依赖于实现细节,它可能随时会中断。
另一个控制因素是系统偏好设置 > 通用 > "Close windows when quitting an app" 的设置。这对应于用户默认键 NSAlternateQuitMenuItem
,尽管这又是一个实现细节。看来您可以在调用 -terminate:
之前设置它,然后在 -applicationWillTerminate:
委托方法中删除该设置。 (您的更改将与您的应用程序相关联。它们不会影响其他应用程序或系统偏好设置中的设置。)当然,您必须确保禁用突然终止才能调用该委托方法。