如何在SwiftUI中实现Dock Menu?
在SwiftUI中实现macOS程序坞菜单
实现思路
SwiftUI本身没有原生的程序坞菜单API,需要结合AppKit的NSApplication来配置,一般在App的入口逻辑中完成设置。
完整实现示例
- 创建程序坞菜单并绑定到App
@main struct MySwiftUIApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate var body: some Scene { WindowGroup { ContentView() .onAppear { // 初始化并绑定程序坞菜单 NSApplication.shared.dockMenu = buildDockMenu() } } } private func buildDockMenu() -> NSMenu { let dockMenu = NSMenu(title: "程序坞快捷菜单") // 添加系统默认的"打开最近项目"项 let recentItem = NSMenuItem( title: "打开最近项目", action: #selector(NSDocumentController.openRecentDocument(_:)), keyEquivalent: "" ) dockMenu.addItem(recentItem) // 添加分隔线 dockMenu.addItem(.separator()) // 添加自定义操作项 let customActionItem = NSMenuItem( title: "快速启动核心功能", action: #selector(appDelegate.triggerCustomAction(_:)), keyEquivalent: "" ) dockMenu.addItem(customActionItem) return dockMenu } }
- 实现菜单事件处理
class AppDelegate: NSObject, NSApplicationDelegate { static let shared = AppDelegate() @objc func triggerCustomAction(_ sender: NSMenuItem) { // 在这里编写菜单触发后的逻辑,比如打开特定视图、执行后台任务 print("程序坞菜单自定义操作已触发") // 通过通知中心通知SwiftUI视图更新(如果需要) NotificationCenter.default.post( name: NSNotification.Name("DockMenuCustomAction"), object: nil ) } }
- 在SwiftUI视图中响应菜单事件(可选)
如果需要在界面中处理菜单触发的动作,可以监听通知:
struct ContentView: View { @State private var showFeatureView = false var body: some View { Text("应用主界面") .onReceive(NotificationCenter.default.publisher(for: NSNotification.Name("DockMenuCustomAction"))) { _ in showFeatureView = true } .sheet(isPresented: $showFeatureView) { Text("核心功能界面") .frame(width: 300, height: 200) } } }
关键注意点
- 该实现仅适用于macOS平台,iOS/iPadOS等平台无程序坞菜单概念,无需处理。
- 菜单项的
action方法必须标记为@objc,因为AppKit依赖Objective-C消息机制。 - 若你的应用采用文档架构(Document-based),可直接复用
NSDocumentController的系统方法实现最近文件功能,无需自行编写逻辑。
内容的提问来源于stack exchange,提问作者Rudy Folden
相关产品推荐
相关产品推荐

