NSMenuItem с действием, добавленным в NSStatusBar, отображается серым цветом, когда выбранная функция перемещается в другой класс - PullRequest
0 голосов
/ 05 мая 2019

Если функция, вызываемая как действие NSMenuItem, не находится в AppDelegate, пункт меню отображается серым цветом.

Кажется, я не могу понять, что именно идет не так ...Может я неправильно инициализирую StatusBarItemController?Как только я перемещаю printToTheWalls в класс AppDelegate, он начинает работать.

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    var statusBarItemController: StatusBarItemController?
    let statusBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application
        statusBarItemController = StatusBarItemController()
        if let button = statusBarItem.button {
            button.image = NSImage(named: NSImage.Name("trayIcon"))
        }
        statusBarItemController?.constructMenu(with: statusBarItem)
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }

}
import Cocoa

class StatusBarItemController {

    func constructMenu(with statusBarItem: NSStatusItem) {
        let menu = NSMenu()
        menu.addItem(NSMenuItem(
            title: "From the windows...",
            action: #selector(printToTheWalls(_:)),
            keyEquivalent: ""
        ))
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(
            title: "Quit",
            action: #selector(NSApplication.terminate(_:)),
            keyEquivalent: "q"
        ))

        statusBarItem.menu = menu
    }

    @objc func printToTheWalls(_ sender: NSMenuItem) {
        //This doesn't seem to be called and/or found
        print("To the Walls!")
    }
}

1 Ответ

0 голосов
/ 06 мая 2019

Решением было вручную установить целевое свойство на self, так как @vadian и @red_menace помогли мне обнаружить это в комментариях к вопросу.

Рабочий код выглядит следующим образом:

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    var statusBarItemController: StatusBarItemController?

    func applicationDidFinishLaunching(_ aNotification: Notification) {
        // Insert code here to initialize your application
        statusBarItemController = StatusBarItemController()
    }

    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }

}
import Cocoa

class StatusBarItemController: NSObject {
    let statusBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)

    override init() {
        super.init()
        if let button = statusBarItem.button {
            button.image = NSImage(named: NSImage.Name("trayIcon"))
        }
        constructMenu()
    }

    func constructMenu() {
        if let button = statusBarItem.button {
            button.image = NSImage(named: NSImage.Name("trayIcon"))
        }
        let menu = NSMenu()

        let fromTheWindowsItem = NSMenuItem(
            title: "From the windows...",
            action: #selector(StatusBarItemController.printToTheWalls(_:)),
            keyEquivalent: ""
        )
        fromTheWindowsItem.target = self
        menu.addItem(fromTheWindowsItem)
        menu.addItem(NSMenuItem.separator())
        menu.addItem(NSMenuItem(
            title: "Quit",
            action: #selector(NSApplication.terminate(_:)),
            keyEquivalent: "q"
        ))

        statusBarItem.menu = menu
    }

    @objc func printToTheWalls(_ sender: NSMenuItem) {
        print("To the Walls!")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...