【问题标题】:Actions assigned to NSMenuItem dont seem to work分配给 NSMenuItem 的操作似乎不起作用
【发布时间】:2019-02-21 21:09:52
【问题描述】:

这是怎么回事:

我正在尝试完全以编程方式构建 Mac 状态栏应用程序。一切似乎都工作正常,即菜单显示在 Mac 状态栏中,下拉菜单显示它应该如何。但是当我点击菜单项时,什么也没有发生。我什至将目标函数更改为只执行打印到终端的基本任务,什么都不做。


关于代码:

我认为问题出在附近:

menu.addItem(NSMenuItem(title: val, action: #selector(toggleService), keyEquivalent: ""))

该代码应该触发 > toggleService 功能。但它什么也没做。问题可能是因为我只是从 NSObject 类继承吗?


代码

// StatusBar.swift

import Cocoa

class StatusBar: NSObject {

    var menuButton = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
    var menu = NSMenu()
    var service = Service()

    override init() {
        super.init()
        menuButton.button?.image = NSImage(named: NSImage.Name("icon"))
        menuButton.menu = menu
        menu.autoenablesItems = false
        for (_, val) in service.list {
            menu.addItem(NSMenuItem(title: val, action: #selector(toggleService), keyEquivalent: ""))
        }
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(title: "Quit", action: #selector(quit), keyEquivalent: ""))
    }

    @objc func toggleService(sender: NSMenuItem) {
        print ("Say Something.. anything??")
    }

    @objc func quit(sender: NSMenuItem) {
        print ("Say Something.. anything??")
    }

}

【问题讨论】:

    标签: swift macos appkit


    【解决方案1】:

    menuItem.target = self

    您需要将目标设置为“自我”。 NSMenuItems 有两个基本要求。一个动作,一个目标,

    1. 动作 menuItem.action: #selector(YOURFUNCTION)

    2. 目标 menuItem.target = self

    因此,要让您的菜单项正常工作,请将 for 循环(在您的 init 调用中)替换为这个新循环:

    for (_, val) in service.list {
        let menuItem = menu.addItem(NSMenuItem(title: val, action: #selector(toggleService), keyEquivalent: ""))
        menuItem.target = self
    }
    

    【讨论】:

    • 非常感谢您的实际工作!我已经被这个问题难住了 2 个小时。
    • NSMenuItem 它是一个类。无需将其声明为变量即可更改其属性值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 2020-12-30
    • 2021-07-19
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多