swift - 分配给 NSMenuItem 的操作似乎不起作用
问题描述
这是发生了什么:
我正在尝试完全以编程方式构建 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??")
}
}
解决方案
menuItem.target = self
您需要将目标设置为“自我”。NSMenuItems 有两个基本要求。一个动作,一个目标,
行动
menuItem.action: #selector(YOURFUNCTION)
目标
menuItem.target = self
因此,要让您的菜单项正常工作,请将 for 循环(在您的 init 调用中)替换为这个新循环:
for (_, val) in service.list {
let menuItem = menu.addItem(NSMenuItem(title: val, action: #selector(toggleService), keyEquivalent: ""))
menuItem.target = self
}
推荐阅读
- c++ - 如何更改结构的字节顺序?
- node.js - 有没有办法在Javascript中的Tensorflow手势模型中找到手到相机的距离?
- sql - AWS Glue 作业失败,错误日志为空
- javascript - 如何在不渲染的情况下获取 vue 组件的 DOM?
- php - 我可以在使用 jquery ajax 的表单提交上同时调用同一个 php 页面上的方法以及另一个 php 代码中的方法吗?
- python - 带有 ModelSelect2Widget 的 AttributeError
- sql - SQL查询查找2020年1月连续3天购物的客户数量
- php - 尽管存在 PHP 文件名/路径无效
- google-chrome - Chrome 将 cookie 保存在哪个文件中?
- laravel - 按 start_date 和 end_date 之间的持续时间排序数据顺序