分配给NSMenuItem的动作似乎不起作用

时间:2019-02-21 21:09:53

标签: swift macos appkit

这是怎么回事:

我正在尝试完全以编程方式构建Mac Status Bar App。一切似乎都工作正常,这是在Mac状态栏中显示了菜单,下拉菜单显示了应有的状态。但是,当我单击菜单项时,没有任何反应。我什至将目标功能更改为仅执行打印到终端的基本任务,而无需执行任何操作。


关于代码:

问题在于我想在这里的某个地方

menu.addItem(NSMenuItem(title: val, action: #selector(toggleService), keyEquivalent: ""))

该代码应触发> toggleService函数。但是它什么也没做。问题可能是由于我仅继承自NSObject类吗?


代码

// StatusBar.swift

import Cocoa

class StatusBar: NSObject {

    var menuButton = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
    var menu = NSMenu()
    var service = Service()

    override init() {
        super.init()
        menuButton.button?.image = NSImage(named: NSImage.Name("icon"))
        menuButton.menu = menu
        menu.autoenablesItems = false
        for (_, val) in service.list {
            menu.addItem(NSMenuItem(title: val, action: #selector(toggleService), keyEquivalent: ""))
        }
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(title: "Quit", action: #selector(quit), keyEquivalent: ""))
    }

    @objc func toggleService(sender: NSMenuItem) {
        print ("Say Something.. anything??")
    }

    @objc func quit(sender: NSMenuItem) {
        print ("Say Something.. anything??")
    }

}

1 个答案:

答案 0 :(得分:0)

menuItem.target = self

您需要将目标设置为“自我”。 NSMenuItems有两个基本要求。一个动作和一个目标,

  1. 动作 menuItem.action: #selector(YOURFUNCTION)

  2. 目标 menuItem.target = self

因此,要使菜单项正常工作,请使用以下新菜单项替换in循环中的for循环:

for (_, val) in service.list {
    let menuItem = menu.addItem(NSMenuItem(title: val, action: #selector(toggleService), keyEquivalent: ""))
    menuItem.target = self
}