在macOS的SwiftUI中如何向默认「View」菜单添加命令?
在macOS SwiftUI中向默认「View」菜单添加自定义命令
要在SwiftUI应用的系统默认「View」菜单下添加自定义命令,核心是利用Commands协议和CommandGroup嵌入自定义内容到系统菜单结构中,以下是具体实现步骤:
1. 创建自定义Commands结构体
定义遵循Commands协议的结构体,通过CommandGroup指定在默认「View」菜单中的插入位置,并添加所需命令项:
// 自定义显示模式枚举,用于控制视图样式 enum DisplayMode { case list, icon, column } struct CustomViewCommands: Commands { // 绑定需要控制的界面状态 @Binding var showSidebar: Bool @Binding var displayMode: DisplayMode var body: some Commands { // 将自定义命令插入到「View」菜单的「显示/隐藏」选项之后 CommandGroup(after: .viewVisibility) { Divider() // 添加分隔线,区分系统默认与自定义命令 // 侧边栏控制命令 Button("显示侧边栏") { showSidebar = true } .keyboardShortcut("S", modifiers: [.command, .shift]) Button("隐藏侧边栏") { showSidebar = false } .keyboardShortcut("H", modifiers: [.command, .shift]) Divider() // 视图模式切换菜单 Menu("显示模式") { Button("列表视图") { displayMode = .list } .keyboardShortcut("1") Button("图标视图") { displayMode = .icon } .keyboardShortcut("2") Button("分栏视图") { displayMode = .column } .keyboardShortcut("3") } } } }
2. 在App中注册自定义Commands
在App结构体里,通过.commands修饰符将自定义Commands绑定到窗口场景:
@main struct MyMacApp: App { // 管理界面状态 @State private var showSidebar = true @State private var displayMode = DisplayMode.column var body: some Scene { WindowGroup { // 将状态传递给ContentView,实现菜单与界面联动 ContentView(showSidebar: $showSidebar, displayMode: $displayMode) } .commands { CustomViewCommands(showSidebar: $showSidebar, displayMode: $displayMode) } } }
关键细节说明
- 插入位置控制:
CommandGroup的after/before参数支持多个系统预定义位置,比如.viewVisibility对应「View」菜单中显示/隐藏类选项,.viewLayout对应布局类选项,可按需选择插入位置。 - 替换默认菜单:若需完全替换默认「View」菜单内容,可使用
CommandGroup(replacing: .view),但不建议这么做——保留系统默认命令更符合macOS人机交互规范。 - 快捷键设置:通过
keyboardShortcut给命令添加快捷键,尽量遵循macOS通用习惯(比如视图切换用Cmd+数字),提升用户体验。 - 状态联动:通过
@Binding将菜单命令与界面状态绑定,确保菜单操作能实时同步到界面显示。
内容的提问来源于stack exchange,提问作者Peter Lapisu
相关产品推荐
相关产品推荐

