swift - 如何检测选择了哪个 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
为每个项目创建独特的功能?
谢谢
解决方案
操作将像使用 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
属性设置为您的延迟值。该属性是一种类型,因此非常适合您的值。tag
Int
当您创建多个条目时,您可以使用for in
循环遍历array
or 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
}
免责声明:这只是在浏览器中剪切和粘贴,因此可能需要一些调整才能实际工作。
推荐阅读
- c# - 如何保存矩阵迷宫分辨率的坐标?
- c# - 使用 Novell.Directory.Ldap.NETStandard 从 AD 读取所有用户
- php - 在生产环境中获取空刷新令牌 - GMAIL OAuth2 API
- regex - 是否可以使用 raku 正则表达式进行布尔断言?
- python-3.x - 我想追踪我写的递归代码
- html - 如何使通知列表元素可以通过上下键在反应中遍历?
- android - 如何进行协程顺序调用
- python - 什么是隔离特定列中具有相同值的数据帧行的有效方法?
- javascript - useStyles 不会根据变量变化动态分配属性
- azure - Azure devOps 2020 RTW - 无法登录到 Azure CLI - 使用 PAT