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 预览期间打开?