如何检测选择了哪个NSMenuItem

时间:2018-08-23 00:56:03

标签: swift macos cocoa nsmenu nsmenuitem

鉴于我有一个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功能?

谢谢

1 个答案:

答案 0 :(得分:1)

操作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中的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
}

免责声明 :这只是在浏览器中剪切和粘贴的,因此可能需要进行一些调整才能真正起作用。