在 SwiftUI for macOS 中,.commands {} 是用来自定义 App 菜单栏的重要接口。可以用它来:
1、添加新的菜单(如“文件”、“帮助”等)。
2、自定义按钮、快捷键。
3、修改或隐藏系统默认菜单(例如“编辑”、“视图”)。
4、响应命令的事件。
基本语法
import SwiftUI
@main
struct ImageSlimApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.frame(width: 100,height: 100)
}
.commands {
CommandMenu("帮助") {
Button("关于 ImageSlim") {
NSApp.orderFrontStandardAboutPanel()
}
}
}
}
}
需要注意的是,.commands{} 是 Scene 的修饰符,不是 View 的修饰符,所以在SwiftUI中只能用于App的Scene(如WindowGroup)上,而不是作用在ContentView()或任何View上。
代码示例
1、添加“帮助” 菜单
.commands {
CommandMenu("帮助") {
Button("关于 ImageSlim") {
NSApp.orderFrontStandardAboutPanel()
}
}
}

2、隐藏默认的“编辑”命令
.commands {
// 隐藏默认的“编辑”菜单(剪切、复制、粘贴等)
CommandGroup(replacing: .pasteboard) {
// 替代或不放内容来隐藏
}
}
隐藏前:

隐藏后:

3、使用CommandGroup插入到已有菜单中
.commands {
CommandGroup(after: .newItem) {
Button("新建压缩任务") {
// 新建逻辑
}
}
}
支持快捷键
可以使用 .keyboardShortcut(…) 可以为菜单项添加快捷键。
.keyboardShortcut("n", modifiers: [.command])
.keyboardShortcut(.delete, modifiers: [.command])
.keyboardShortcut(.escape)
例如:
.commands {
CommandGroup(after: .newItem) {
Button("新建压缩任务") {
// 新建逻辑
}
.keyboardShortcut("m", modifiers: [.command])
}
}

可用位置标识(CommandGroup)
SwiftUI 中的 .commands 修饰符可用于在 macOS App 的菜单栏中插入、替换或删除菜单项。
具体控制位置的是 CommandGroupPlacement 枚举,它提供了一系列位置标识符(placement key),用来定义希望插入或替换的菜单位置。
以下是 SwiftUI 支持(Xcode 16所支持)的全部可用位置标识,适用于 .commands { CommandGroup(…) } 中:
1、appInfo:关于应用。
2、appSettings:应用设置。
3、systemServices:系统服务。
4、appVisibility:隐藏当前 App 等。
5、appTermination:退出应用。
6、newItem:新建/打开。
7、saveItem:保存/关闭。
8、importExport:导入导出。
9、printItem:打印。
10、undoRedo:撤销重做。
11、pasteboard:剪贴板。
12、textEditing:文本编辑操作。
13、textFormatting:文本样式。
14、toolbar:工具栏控制。
15、sidebar:侧边栏与全屏。
16、windowSize:窗口大小控制。
17、windowList:窗口列表。
18、singleWindowList:单窗口列表(macOS 13+)。
19、windowArrangement:窗口排列。
20、help:帮助。
使用方法
通过CommandGroup插入:
1、CommandGroup(before: .xxx):插入到 xxx 之前。
2、CommandGroup(after: .xxx):插入到 xxx 之后。
3、CommandGroup(replacing: .xxx):替换整个 xxx 区域(可清空系统菜单)。
例如,在关于应用前后插入菜单:
.commands {
CommandGroup(after: .appInfo) {
Text("关于应用之后")
}
CommandGroup(before: .appInfo) {
Text("关于应用之谦")
}
}

总结
通过CommandMenu添加新的菜单。
通过CommandGroup(before:/after:/replacing:)修改已有的菜单。
使用.keyboardShortcut,实现对于快捷键的支持。