4

如何在基于 SwiftUI ReferenceFileDocument 的应用程序中打开新文档窗口?

背景

此 macOS 应用程序以编程方式WindowGroups使用.handleEvents(:). 不幸的是,这会导致文件/新建菜单将这些窗口组的名称包含在“新建...窗口”中(如图所示)。未能找到覆盖该包装的方法,我试图完全使用CommandGroup(replacing: .newItem) {}.

然而,我也未能重新制作“创建并打开一个新的文档窗口”命令。我试过搜索一些通知来发布和申请.handleEvents。这只会使现有的打开文档窗口成为关键窗口。没有打开的文档,它什么也不做。

不需要的包装

在此处输入图像描述

@main
struct TheApp: App {
    
    @StateObject var root: RootStore
    
    var body: some Scene {
        DocumentGroup { ProjectDocument() } editor: { doc in
            DocumentGroupRoot(...)
        }.commands { Menus(root: root) }
        
        WindowGroup("Preset Color Maps") {
             ... .handlesExternalEvents(matching: ...) /// Allows multiple windows
        }.handlesExternalEvents(matching: ...)
        
        WindowGroup("Tutorial") {
             ...
        }.handlesExternalEvents(matching: ...)
    }
}

卡在接线“新项目”更换

在此处输入图像描述

struct NewCommands: Commands {
    var body: some Commands {
        CommandGroup(replacing: .newItem) {
            NewProjectButton()
        }
        
        CommandGroup(after: .newItem) {
            ImportersButtons()
        }
    }

    private struct NewButton: View {
        
        @Environment(\.openURL) var openURL
        
        var body: some View {
            Button("New Project") { openURL(ExternalEvents.new.url) }
                .keyboardShortcut("n", modifiers: .command)
        }
    }
}
@main
struct TheApp: App {
    
    @StateObject var root: RootStore
    
    var body: some Scene {
        DocumentGroup { ProjectDocument() } editor: { doc in
            DocumentGroupRoot(...)
                .handlesExternalEvents(...) /// Doesn't enable new doc windows
        }.commands { Menus(root: root) }
         .handlesExternalEvents(matching: ...) /// Only makes existing doc key window
        
        ...
    }
}
4

1 回答 1

3

不错,经典。贴出来然后解决。解决方案只是回到共享的 NSDocumentController 并要求一个新文档。我会在角落里脸红。

Button("New Project") {
      NSDocumentController.shared.newDocument(nil)
}
于 2021-05-07T22:41:21.710 回答