【问题标题】:Menu Bar Extra not opening on left click菜单栏 Extra 未在左键单击时打开
【发布时间】:2019-01-29 00:57:11
【问题描述】:

我有一个在 macOS 的菜单栏上显示自定义视图的应用程序。单击自定义视图时,我想显示一个上下文菜单(NSMenu)。

我的代码如下所示:

private let statusItem = NSStatusBar.system().statusItem(withLength: NSVariableStatusItemLength)
private var timer: Timer?
private var view: MenuView!
private var menu: NSMenu!
private let popover = NSPopover()
private var popoverController: PopoverViewController?

func applicationDidFinishLaunching(_ aNotification: Notification)
{
    self.view = createView()
    self.statusItem.view = self.view

    self.menu = NSMenu()
    self.menu.addItem(NSMenuItem(title: "Quit", action: nil, keyEquivalent: ""))
    self.statusItem.menu = self.menu

    self.statusItem.menu = menu
}

但是,当我单击视图时,菜单并没有像我预期的那样显示(嗯,它根本没有显示)。 当我不使用自定义视图而只设置图像时,单击它会打开上下文菜单。 使用自定义视图时如何显示菜单?

【问题讨论】:

    标签: swift menubar nsmenu


    【解决方案1】:

    如果您使用自定义视图,您有责任处理所有事件、绘图和突出显示。

    在视图的init(frame:) 方法中传递NSStatusBar 实例。将菜单分配给视图而不是statusItem

    至少你必须覆盖mouseDown

    override func mouseDown(with theEvent: NSEvent) {
        statusItem.popUpMenu(menu!)
        needsDisplay = true
    }
    

    【讨论】:

    • 感谢您的提示,我采用了稍微不同的方法。我仍然将菜单分配给状态项。单击视图时会发送通知,然后在 AppDelegate 中进行处理。这里调用了 popUpMenu 函数。谢谢。
    • 不鼓励您向Appdelegate 发送通知,因为可以从任何地方直接访问该实例 (NSApp.delegate)。仅当有多个接收者或视图/控制器彼此不相关时才使用通知。此外,我建议将有关视图的逻辑始终保持在 in 视图中。
    • 好的,那我改一下,再次感谢。不知道 NSApp.delegate 访问权限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2021-01-18
    • 1970-01-01
    • 2021-09-19
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多