Создайте и откройте новый документ в SwiftUI DocumentGroup macOS

Как я могу открыть новое окно документа в приложении на основе SwiftUI ReferenceFileDocument?

Задний план

Это приложение macOS открывается программно WindowGroups с использованием .handleEvents(:). К сожалению, это приводит к появлению меню File / New, в котором имена этих групп окон заключаются в «New ... Window» (как показано на рисунке). Не сумев найти способ переопределить эту упаковку, я попытался просто заменить кнопку New и ее меню полностью, используя 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
        
        ...
    }
}

1 ответ

Хорошо, классика. Написал, а потом решил. Решение просто возвращалось к общему NSDocumentController и запрашивало новый документ. Я пойду краснею в угол.

      Button("New Project") {
      NSDocumentController.shared.newDocument(nil)
}
Другие вопросы по тегам