如何在SwiftUI macOS应用中程序化控制主菜单快捷键
解决方案
你可以通过动态生成KeyboardShortcut实例的方式,结合你的三个状态变量实现需求。核心思路是根据EnableShortcutKey决定是否启用快捷键,同时用ShortcutKey和Modifiers动态配置快捷键的按键与修饰符,具体实现如下:
修改后的完整代码
@main struct MyApp: App { @ObservedObject var appState = DataViewModel.shared var body: some Scene { WindowGroup { ContentView() } .commands { CommandGroup(replacing: .pasteboard) { Button(action: { appState.nextCurrentID() }) { Text("Next") } .keyboardShortcut( appState.EnableShortcutKey ? KeyboardShortcut( KeyEquivalent(appState.ShortcutKey.first ?? "A"), modifiers: appState.Modifiers ) : nil ) } } } }
关键实现说明
- 启用/禁用快捷键:当
appState.EnableShortcutKey为false时,给keyboardShortcut传入nil,即可禁用该菜单项的快捷键;为true时则生成有效的KeyboardShortcut实例。 - 动态设置快捷键按键:
KeyEquivalent要求单个字符,因此取appState.ShortcutKey的第一个字符作为按键(如果字符串为空则用默认值"A"兜底)。 - 动态设置修饰符:直接复用
appState.Modifiers,它的类型NSEvent.ModifierFlags与KeyboardShortcut的modifiers参数类型完全匹配,无需额外转换。
由于appState是@ObservedObject,且三个状态变量标记了@Published,当这些变量的值发生变化时,SwiftUI会自动更新菜单项的快捷键配置,无需手动刷新视图。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

