繁体   English   中英

菜单项在macOS菜单栏App中禁用

[英]menu items disabled in macOS menubar App

我正在尝试在macOS上构建一个菜单栏应用程序。

我似乎无法弄清楚为什么一些菜单项被禁用...截图:

该应用的屏幕截图

如您所见, Quit菜单项已启用,并在单击时退出应用程序。 但是, “首选项”项已禁用。

我的代码

AppDelegate.swift:

let menuBarItem = NSStatusBar.system().statusItem(withLength: NSSquareStatusItemLength)

func applicationDidFinishLaunching(_ aNotification: Notification) {
    menuBarItem.button?.image = NSImage(named: "MenuBarIcon")
    menuBarItem.menu = MenuBarMenu()
}

MenuBarMenu.swift:

class MenuBarMenu: NSMenu {
    init() {
        super.init(title: "Menu")
        self.addItem(withTitle: "Preferences...", action: #selector(MenuBarActions.openPreferencesWindow(_:)), keyEquivalent: "")
        self.addItem(NSMenuItem.separator())
        self.addItem(withTitle: "Quit", action: #selector(MenuBarActions.terminate(_:)), keyEquivalent: "")
    }

    required init(coder decoder: NSCoder) {
        fatalError("init(coder:) has not been impemented")
    }
}

class MenuBarActions {
    @objc static func terminate(_ sender: NSMenuItem) {
        NSApp.terminate(sender)
    }

    @objc static func openPreferencesWindow(_ sender: NSMenuItem) {
        print("preferences")
    }
}

我使用完全相同的方式为选择器创建MenuBarItems和相同的结构,所以我对这种不一致感到有些困惑。 这种情况发生的原因是什么?如何解决这个问题?

您的退出菜单项“意外”工作。 它没有使用您实现的terminate(_:)方法。 在那里放一个print()语句,你会发现它没有被调用。

菜单项要么指定了特定的目标对象,要么使用响应程序链来搜索适当的目标。 您没有为菜单项指定目标,因此他们正在使用响应程序链。 您的MenuBarActions 不是响应者链的一部分。 (类通常不能。某些对象可以。)因此,菜单项永远不会以您的类为目标。

Quit菜单有效,因为应用程序对象位于响应程序链上,并且它具有terminate(_:)方法。 实际上,这就是你的terminate(_:)方法在被调用时会调用的内容。 但菜单项实际上是直接调用它。

您应该创建一个实际的控制器对象(不仅仅是类)来实现操作方法,并将菜单项的target属性设置为它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM