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

顺便说一句,我假设我们还有一个状态栏图标,它将用作应用程序的锚点。