鉴于我有一个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
功能?
谢谢
答案 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
循环遍历array
或dictionary
,为每个条目创建一个新的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
}
免责声明 :这只是在浏览器中剪切和粘贴的,因此可能需要进行一些调整才能真正起作用。