我正在使用 SwiftUI 构建一个 MacOS 应用程序,总体来说它运行得很好。但我正在尝试实现一个文件导入功能,但遇到了一个我不明白的问题。我创建了一个简单的基于 JSON 的自定义文件格式,我可以使用“文件”菜单命令导出该文件格式,也可以毫无问题地导入该文件格式。但我还尝试允许通过将文件拖放到 Finder 中应用程序的图标上来导入文件,结果发现这是有问题的。
该应用程序采用单窗口界面设计,每个可以导入/打开的文件都在主窗口/视图的列表界面中以列表形式表示。当我使用菜单命令时,它会按预期工作。当我将文件放在应用程序图标上时,它会添加该文件表示的列表,但还会打开应用程序主窗口的新实例。
我的应用程序是使用 SwiftUI 应用程序结构设置的。它的主体由一个 WindowGroup 组成,该 WindowGroup 包含一个 NavigationStack,而 NavigationStack 又包含主视图/窗口。 App 结构还声明了一个引用 AppDelegate 类的 NSApplicationDelegateAdaptor。该 AppDelegate 类包含将文件拖放到其图标上时调用的代码:
func application(_ application: NSApplication, open urls: [URL]) {
// checks to make sure requirements are fulfilled,
// then calls the file import method
}
我是否使用了错误的方法来实现此功能,或者我还做错了什么?换句话说,如何通过将文件拖放到应用程序图标上来导入/打开文件,而不在单窗口应用程序中生成不需要的新窗口?
我在添加到我发现与我的问题相关的答案的评论中找到了解决方案。在 SwiftUI's application(_ openFile:) never call when opening a file from Finder 中找到的解决方案是添加
.handlesExternalEvents(matching: [])
我的 App 结构中 WindowGroup 块的修饰符。