如何检测选择了哪个 NSMenuItem

How To Detect Which NSMenuItem Was Selected

假设我有一个 menuBar 应用程序,其子菜单上有 3 个项目:

let delaySubMenu = NSMenu()

delaySubMenu.addItem(NSMenuItem(title: "5", action: #selector( setReminder(_:)), keyEquivalent: ""))
delaySubMenu.addItem(NSMenuItem(title: "10", action: #selector(setReminder(_:)), keyEquivalent: ""))
delaySubMenu.addItem(NSMenuItem(title: "15", action: #selector(setReminder(_:)), keyEquivalent: ""))

如何检测我的 delaySubMenu 项中的哪些项已被选中,而无需为每个项创建唯一的 setReminder 函数?

谢谢

操作 selector 将接收 sender 对象,就像您使用 Interface Builder 时一样。所以你的 setReminder(_:) 选择器可以有签名:

func setReminder(_ sender: Any) {
// Coerce sender to NSMenuItem and use it to make your decisions
}

或:

func setReminder(_ sender: NSMenuItem) {
// Don't do any coercion work you don't need to do…
}

您还可以将 tag property of the NSMenuItem 设置为您的延迟值。 tag 属性 是 Int 类型,因此非常适合您的值。

当您创建多个条目时,您可以使用 for in 循环遍历 arraydictionary,为每个条目创建一个新的 NSMenuItem。所以我们可以将您的原始代码更改为类似于此示例的代码,其中我使用 dictionary:

let delaySubMenu = NSMenu()
let delays = ["5 Minutes" : 5, "10 Minutes" : 10, "15 Minutes" : 15] // This is a dictionary of String:Int

for (titleKey, value) in delays {
    let menuItem = NSMenuItem(title: titleKey, action: #selector(setReminder(_:)), keyEquivalent: nil)
    menuItem.tag = value
    delaySubMenu.addItem(menuItem)
}

func setReminder(_ sender: NSMenuItem) {
    let delayValue = sender.tag // delayValue is a Int by inference from tag

    // Do something with your delay value
}

免责声明:这只是在浏览器中剪切和粘贴,因此可能需要一些调整才能实际工作。