从我的 Cocoa 应用程序中的视图控制器向 Dock 菜单添加项目

UKD*_*eek 2 macos cocoa swift

我已经通过应用程序委托方法在我的 Mac 应用程序中实现了一个停靠菜单:

func applicationDockMenu(sender: NSApplication) -> NSMenu? {
        let newMenu = NSMenu(title: "MyMenu")
        let newMenuItem = NSMenuItem(title: "Common Items", action: "selectDockMenuItem:", keyEquivalent: "")
        newMenuItem.tag = 1
        newMenu.addItem(newMenuItem)
        return newMenu
Run Code Online (Sandbox Code Playgroud)

有没有办法可以从我的视图控制器中向菜单添加项目 - 我似乎无法在我的 NSApplication 对象中找到一个方法。还有其他地方我应该看看吗?

Kev*_*Low 5

由于applicationDockMenu:是委托方法,使用实例方法添加菜单项会与委托返回冲突。

您可以做的是使停靠菜单成为应用程序委托类中的属性/实例变量。这样,您的视图控制器可以通过将菜单引用从您的应用程序委托传递给您的视图控制器(您将拥有一个dockMenu属性)或全局引用它(不太推荐)来修改菜单。

class AppDelegate: NSObject, NSApplicationDelegate {
    @IBOutlet weak var window: NSWindow!
    var dockMenu = NSMenu(title: "MyMenu")

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        if let viewController = ViewController(nibName: "ViewController", bundle: nil) {
            viewController.dockMenu = self.dockMenu
            self.window.contentViewController = viewController
        }
    }

    func applicationDockMenu(sender: NSApplication) -> NSMenu? {
        return self.dockMenu
    }


class ViewController: NSViewController {
    var dockMenu: NSMenu?

    // Button action
    @IBAction func updateDockMenu(sender: AnyObject) {
        self.dockMenu?.addItem(NSMenuItem(title: "An Item", action: nil, keyEquivalent: ""))
    }
}
Run Code Online (Sandbox Code Playgroud)