首页 > 解决方案 > 如何检测选择了哪个 NSMenuItem

问题描述

鉴于我有一个菜单栏应用程序,子菜单上有 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为每个项目创建独特的功能?

谢谢

标签: swiftmacoscocoansmenunsmenuitem

解决方案


操作将像使用 Interface Builder 一样selector接收对象。sender所以你的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…
}

您还可以将NSMenuItem的tag属性设置为您的延迟值。该属性是一种类型,因此非常适合您的值。tagInt

当您创建多个条目时,您可以使用for in循环遍历arrayor dictionary,为每个条目创建一个新NSMenuItem条目。因此,我们可以将您的原始代码更改为我使用字典的示例:

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
}

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


推荐阅读