Действия, назначенные NSMenuItem, не работают - PullRequest
0 голосов
/ 22 февраля 2019

Вот что происходит:

Я пытаюсь создать приложение Mac Status Bar полностью программно.Кажется, все работает нормально, то есть меню отображается в строке состояния 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??")
    }

}

1 Ответ

0 голосов
/ 22 февраля 2019

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
}
...