我正在尝试完全以编程方式构建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??")
}
}
答案 0 :(得分:0)
menuItem.target = self
您需要将目标设置为“自我”。 NSMenuItems有两个基本要求。一个动作和一个目标,
动作
menuItem.action: #selector(YOURFUNCTION)
目标
menuItem.target = self
因此,要使菜单项正常工作,请使用以下新菜单项替换in循环中的for循环:
for (_, val) in service.list {
let menuItem = menu.addItem(NSMenuItem(title: val, action: #selector(toggleService), keyEquivalent: ""))
menuItem.target = self
}