加载 SwiftUI 预览时阻止 AppKit 主应用程序窗口打开

Ale*_*ica 7 appkit nsapplication-delegate swift swiftui swiftui-previews

我有一个 Mac 应用程序,主要是用 AppKit 编写的。随着时间的推移,我在 SwiftUI 中添加新视图,并且一直使用 SwiftUI 预览来预览新的 SwiftUI 视图和旧的 AppKit 视图/视图控制器(请参阅预览不仅仅适用于 SwiftUI 视图)。

我遇到的一个麻烦是启动 SwiftUI 预览会打开我的应用程序的主窗口。这是预览如何通过常规启动流程的结果,例如调用applicationDidFinishLaunching(_:)我的应用程序代理,这是我在启动时实例化并显示应用程序主窗口的地方。当然,如果我在预览中处理视图,我不希望发生这种情况。

我的 AppDelegate 如下所示:

@NSApplicationMain
public class AppDelegate: NSObject, NSApplicationDelegate {
    lazy var mainWindowController = MainWindowController()

    public func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Nasty hack :(
        let isInSwiftUIPreview = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1"

        if !isRunningInTest() && !isInSwiftUIPreview {
            mainWindowController.showWindow(self)
        }
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

如您所见,如果此代码在测试或 SwiftUI 预览中运行,我添加了不显示主窗口的特殊情况。这味道让我觉得我做错了。

事实上,Apple 在Mastering Xcode Previews 的41:41 中提到了这个确切的问题。他们建议让您的应用程序具有场景感知能力,并使用 aUISceneDelegate来完成这项工作。然而,这是一个仅限 iOS/catalyst 的 API,我没有看到 AppKit 的明显替代方案。

话虽如此:打开 AppKit 应用程序主窗口的正确方法是什么,这样它就不会在测试或 SwiftUI 预览期间打开?