swift Mac Catalyst应用程序:如何在不终止应用程序的情况下关闭窗口?

pb3skfrl  于 2023-05-21  发布在  Swift
关注(0)|答案(3)|浏览(214)

我正在使用Mac Catalyst开发应用程序。
当用户在Mac版本上关闭窗口时,应用程序将终止。
在可可中,可以使用以下命令更改此行为:

applicationShouldTerminateAfterLastWindowClosed

方法或通过在plist文件中将NSSupportsAutomaticTermination设置为NO。
如何在Mac Catalyst应用程序中获得相同的功能?

yeotifhr

yeotifhr1#

我已经与苹果技术开发人员支持讨论了这个问题。经过长时间的讨论,他们承认这是苹果方面的一个bug。已经升级到工程队了。
更新:Apple工程团队提供了关于此问题的以下信息,并为我工作:
我们能够通过在info.plist中添加NSSupportsAutomaticTermination = NO来防止退出行为

brvekthn

brvekthn2#

编辑

此答案不起作用,请查看评论。

编辑结束

这只有在激活“支持多个窗口”时才有可能:

我的想法,为什么会是这样:macOS区分了应用程序和Windows。因此,如果您的应用程序只能打开一个窗口,关闭该窗口将告诉macOS关闭应用程序。
PS:我在“支持多个窗口”模式下遇到了一些bug。我希望他们很快就会被删除。

5vf7fwbs

5vf7fwbs3#

以下是我的解决方案,也许有人还在寻找这个:)
首先,我们需要访问AppKit。在这个链接中,你可以找到一个很好的解释如何做到这一点,以及一些先睹为快的下一步。link
一旦我们准备好了AppKit包,并阅读了如何禁用窗口上的缩放按钮的说明(在上面的链接中),我们就准备好做我们真正想要的事情了;这是为了避免在点击关闭按钮时应用程序终止。为此,我们将简单地劫持关闭按钮,并告诉它做我们需要的...

- (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
顺便说一句,我假设我们也有一个状态栏图标,将作为一个锚的应用程序。

相关问题