【问题标题】:menu items disabled in macOS menubar AppmacOS 菜单栏应用程序中禁用的菜单项
【发布时间】:2017-05-15 11:19:01
【问题描述】:

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

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

如您所见,Quit 菜单项已启用,并在单击时退出应用程序。 Preferences 项被禁用。

我的代码

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 和相同的结构,所以我对这种不一致感到有些困惑。发生这种情况的原因是什么?我该如何解决这个问题?

【问题讨论】:

    标签: swift macos swift3


    【解决方案1】:

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

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

    退出菜单有效,因为应用程序对象位于响应者链上,并且它有一个terminate(_:) 方法。事实上,如果您的 terminate(_:) 方法被调用,它就会调用它。但是菜单项实际上是直接调用它。

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

    【讨论】:

    • 您好,感谢您的洞察力。正如你所说,被调用的函数不是我想的那样,我发现了响应者链:) 但是,我还没有设法创建 MenuItems 可以使用的控制器对象。你介意写一些示例代码吗?
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 2019-11-24
    • 2020-05-05
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多