macCatalyst 应用程序:如何在不终止应用程序的情况下关闭 window?
macCatalyst app: how to close a window without terminating the app?
我正在使用 macCatalyst 开发应用程序。
当用户在 mac 版本上关闭 window 时,应用程序将终止。
可以在 cocoa 中更改此行为,方法是:
applicationShouldTerminateAfterLastWindowClosed
方法或在 plist 文件中将 NSSupportsAutomaticTermination 设置为 NO。
如何在 macCatalyst 应用程序中获得相同的内容?
编辑
此答案无效,请参阅评论。
编辑结束
这只有在您激活 "Supports multiple windows":
时才有可能
我的想法,为什么会这样:macOS区分应用程序和windows。因此,如果您的应用程序只能打开一个 window,关闭它会告诉 macOS 关闭该应用程序。
PS:我在 "supports multiple windows" 模式下遇到了一些错误。我希望,它们将很快被删除。
我已经与 Apple 技术开发人员支持人员讨论了该问题。经过长时间的讨论,他们承认这是 Apple 方面的一个错误。它已上报给工程团队。
更新:
Apple 工程团队提供了有关此问题的以下信息,对我有用:
我们可以通过将 NSSupportsAutomaticTermination = NO 添加到 info.plist
来防止退出行为
这是我的解决方案,也许有人还在寻找这个:)
1st 我们需要访问 AppKit。在此 link 中,您可以找到关于如何操作的很好的解释,以及对下一步的一些先睹为快。 link
一旦我们准备好了 AppKit 包,并阅读了如何禁用 window 上的缩放按钮的说明(在上面的 link 上),我们就可以开始实际操作了想;这是为了避免在单击“关闭”按钮时终止应用程序。为此,我们将简单地劫持关闭按钮并告诉它执行我们需要的操作...
- (void) tweakWindowButtons
{
NSArray *windows = NSApplication.sharedApplication.windows;
NSWindowCollectionBehavior behavior = NSWindowCollectionBehaviorFullScreenAuxiliary | NSWindowCollectionBehaviorFullScreenNone;
for (NSWindow *window in windows) {
[window setCollectionBehavior:behavior];
//-- Hijack close button action
NSButton *button = [window standardWindowButton:NSWindowCloseButton];
[button setTarget:self];
[button setAction:@selector(closeButtonAction)];
button = [window standardWindowButton:NSWindowZoomButton];
[button setEnabled:NO];
}
}
- (void) closeButtonAction
{
NSApplicationActivationPolicy policy = NSApplicationActivationPolicyAccessory;
//-- hide app icon and window
NSApplication.sharedApplication.activationPolicy = policy;
}
}
要恢复视图,请将策略设置为 NSApplicationActivationPolicyRegular
顺便说一句,我假设我们还有一个状态栏图标,它将用作应用程序的锚点。
我正在使用 macCatalyst 开发应用程序。
当用户在 mac 版本上关闭 window 时,应用程序将终止。
可以在 cocoa 中更改此行为,方法是:
applicationShouldTerminateAfterLastWindowClosed
方法或在 plist 文件中将 NSSupportsAutomaticTermination 设置为 NO。
如何在 macCatalyst 应用程序中获得相同的内容?
编辑
此答案无效,请参阅评论。
编辑结束
这只有在您激活 "Supports multiple windows":
时才有可能我的想法,为什么会这样:macOS区分应用程序和windows。因此,如果您的应用程序只能打开一个 window,关闭它会告诉 macOS 关闭该应用程序。
PS:我在 "supports multiple windows" 模式下遇到了一些错误。我希望,它们将很快被删除。
我已经与 Apple 技术开发人员支持人员讨论了该问题。经过长时间的讨论,他们承认这是 Apple 方面的一个错误。它已上报给工程团队。
更新: Apple 工程团队提供了有关此问题的以下信息,对我有用:
我们可以通过将 NSSupportsAutomaticTermination = NO 添加到 info.plist
来防止退出行为这是我的解决方案,也许有人还在寻找这个:)
1st 我们需要访问 AppKit。在此 link 中,您可以找到关于如何操作的很好的解释,以及对下一步的一些先睹为快。 link
一旦我们准备好了 AppKit 包,并阅读了如何禁用 window 上的缩放按钮的说明(在上面的 link 上),我们就可以开始实际操作了想;这是为了避免在单击“关闭”按钮时终止应用程序。为此,我们将简单地劫持关闭按钮并告诉它执行我们需要的操作...
- (void) tweakWindowButtons
{
NSArray *windows = NSApplication.sharedApplication.windows;
NSWindowCollectionBehavior behavior = NSWindowCollectionBehaviorFullScreenAuxiliary | NSWindowCollectionBehaviorFullScreenNone;
for (NSWindow *window in windows) {
[window setCollectionBehavior:behavior];
//-- Hijack close button action
NSButton *button = [window standardWindowButton:NSWindowCloseButton];
[button setTarget:self];
[button setAction:@selector(closeButtonAction)];
button = [window standardWindowButton:NSWindowZoomButton];
[button setEnabled:NO];
}
}
- (void) closeButtonAction
{
NSApplicationActivationPolicy policy = NSApplicationActivationPolicyAccessory;
//-- hide app icon and window
NSApplication.sharedApplication.activationPolicy = policy;
}
}
要恢复视图,请将策略设置为 NSApplicationActivationPolicyRegular
顺便说一句,我假设我们还有一个状态栏图标,它将用作应用程序的锚点。