如何检测选择了哪个 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
循环遍历 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
}
免责声明:这只是在浏览器中剪切和粘贴,因此可能需要一些调整才能实际工作。
假设我有一个 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
循环遍历 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
}
免责声明:这只是在浏览器中剪切和粘贴,因此可能需要一些调整才能实际工作。