You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI中实现Dock Menu?

在SwiftUI中实现macOS程序坞菜单

实现思路

SwiftUI本身没有原生的程序坞菜单API,需要结合AppKit的NSApplication来配置,一般在App的入口逻辑中完成设置。

完整实现示例

  1. 创建程序坞菜单并绑定到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
    }
}
  1. 实现菜单事件处理
class AppDelegate: NSObject, NSApplicationDelegate {
    static let shared = AppDelegate()
    
    @objc func triggerCustomAction(_ sender: NSMenuItem) {
        // 在这里编写菜单触发后的逻辑,比如打开特定视图、执行后台任务
        print("程序坞菜单自定义操作已触发")
        // 通过通知中心通知SwiftUI视图更新(如果需要)
        NotificationCenter.default.post(
            name: NSNotification.Name("DockMenuCustomAction"),
            object: nil
        )
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:45:00