如何在 SwiftUI 原生 App 中重新映射 macOS 默认键盘快捷键

How to remap macOS default keyboard shortcuts in a SwiftUI native app

提问人:ScottM 提问时间:9/30/2023 更新时间:9/30/2023 访问量:48

问:

我正在使用 SwiftUI 构建一个适用于 iOS、iPadOS 和 macOS 的多平台 app。macOS 应用程序将是本机应用程序,而不是使用 Catalyst。

该应用程序具有许多不同的数据类型可以添加,其主体是事件类型。我想将它们添加为“文件”菜单中的子菜单,其中最常用的新事件操作以 ⌘N 的形式提供。

该键盘快捷键当前映射到“新建窗口”内置菜单操作。我想保留该操作,但将其键盘快捷键重新映射到 ⌘⇧N

但是,我看不出该怎么做。

目前,我有一个定义如下的命令集(带有一个环境对象,用于处理相关面板的显示和导航):

struct NewItemCommands: Commands {
    @EnvironmentObject private var appNavigation: AppNavigation

    var body: some Commands {
        CommandGroup(before: .newItem) {
            Menu("New") {
                Button("Event", action: appNavigation.newEvent)
                    .keyboardShortcut("N")
                Button("Genre", action: appNavigation.newGenre)
                Button("Publication", action: appNavigation.newPublication)
                Button("Venue", action: appNavigation.newVenue)
            }
            .disabled(appNavigation.isShowingModal)
        }
    }
}

这给了我我想要的子菜单,并为“新>事件”分配了正确的快捷方式。但是,新窗口的默认快捷方式仍然存在,但永远不会得到响应:

Example of menu, as modified by the above code

有没有办法重新映射新窗口的快捷方式 - 或者有一种方法可以创建一个具有相同功能的新命令,我可以用它来替换默认值,并分配我自己的快捷方式?

macOS SwiftUI 菜单

评论


答:

1赞 Sweeper 9/30/2023 #1

您可以使用代替 .传入以替换“新窗口”菜单项,然后添加您自己的实现,使用 .CommandGroup(replacing:)CommandGroup(before:).newItemkeyboardShortcut(...)

.commands {
    CommandGroup(replacing: .newItem) {
        Menu("New") {
            Button("Event", action: {...})
                .keyboardShortcut("N")
            Button("Genre", action: {...})
            Button("Publication", action: {...})
            Button("Venue", action: {...})
        }
        Button("New Window") {
            // get this with @Environment(\.openWindow) var openWindow
            // and give your WindowGroup some id
            openWindow(id: "Some ID")
        }.keyboardShortcut("N", modifiers: [.command, .shift])
    }
}