Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何检测选择了哪个NSMenuItem_Swift_Macos_Cocoa_Nsmenu_Nsmenuitem - Fatal编程技术网

Swift 如何检测选择了哪个NSMenuItem

Swift 如何检测选择了哪个NSMenuItem,swift,macos,cocoa,nsmenu,nsmenuitem,Swift,Macos,Cocoa,Nsmenu,Nsmenuitem,假设我有一个菜单栏应用程序,子菜单上有3个项目: let delaySubMenu = NSMenu() delaySubMenu.addItem(NSMenuItem(title: "5", action: #selector( setReminder(_:)), keyEquivalent: "")) delaySubMenu.addItem(NSMenuItem(title: "10", action: #selector(setReminder(_:)), keyEquivalent:

假设我有一个菜单栏应用程序,子菜单上有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
项中的哪一项已被选中,而不为每一项设置唯一的
setrementer
功能


谢谢

操作
选择器
将接收
发送者
对象,就像您使用Interface Builder时一样。因此,您的
设置提醒(:)
选择器可以具有以下签名:

func setReminder(_ sender: Any) {
// Coerce sender to NSMenuItem and use it to make your decisions
}
或:

您还可以将的设置为延迟值。
tag
属性是一种
Int
类型,因此与您的值非常匹配

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


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

NSMenuItem有什么比标记更可靠的特性?你肯定不是建议他使用标题??不…我的意思是不直接将值存储在标记中…而是使用它存储标识符…我想这并不像我应该说的那么清楚-我会更新它,我可以使用第二个示例“let someVar=sender.title”来获取我需要的内容,但您可能希望使用完整的示例进行更新,我找不到有关强制的更多信息,不得不进行猜测。如果我使用的是
sender:Any
,我会
强制它使用类似于
让someVar=sender.title作为NSMenuItem
?很抱歉,但我认为使用
title
来识别哪个菜单项这是一个糟糕的想法。这只是拙劣的练习。使用
标记
或子类并为其指定属性。标记不需要“在整个应用程序中都是唯一的”,因此这个答案的整个表达方式都是误导性的。@ian和@matt-更新了创建
NSMenuItem
并使用
标记存储值的示例…这比将
标题
字符串
强制为
Int
func setReminder(_ sender: NSMenuItem) {
// Don't do any coercion work you don't need to do…
}
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
}