代码之家  ›  专栏  ›  技术社区  ›  ian

如何检测选择了哪个NSMenuItem

  •  1
  • ian  · 技术社区  · 7 年前

    假设我有一个菜单栏应用程序,子菜单上有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 每个人的功能?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Craig    7 年前

    行动 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…
    }
    

    你也可以设置 tag property NSMenuItem 标签 属性是 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
    }
    

    免责声明

    推荐文章