Создайте и откройте новый документ в 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)
}