首页 > 解决方案 > 如果窗口不可见,则在 NSMenu 中查看不可点击

问题描述

我在“应用程序是代理”-应用程序中使用 NSMenu 遇到了一个非常奇怪的行为。

我有以下简单的代码来设置带有 NSMenu 的标题栏图标。该菜单包含一个带有 NSSwitch 按钮的自定义视图。

class AppDelegate: NSObject, NSApplicationDelegate {
    
   let statusBarItem = NSStatusBar.system.statusItem(withLength: -1)
    


    func applicationDidFinishLaunching(_ aNotification: Notification) {
        
        let icon = NSImage(imageLiteralResourceName:"flag")
        statusBarItem.image = icon
        
        let menu: NSMenu = NSMenu()
        var menuItem = NSMenuItem()
        
        let frame = CGRect(origin: .zero, size: CGSize(width: 100, height: 20))
        let viewHint = NSView(frame: frame)
        
        let switchButton = NSSwitch(frame: frame)
        viewHint.addSubview(switchButton)
        
        
        menuItem.view = viewHint
        
        menu.addItem(menuItem)
        
        statusBarItem.menu=menu
        
    }

只要应用程序窗口集中,它就可以很好地工作。

当我关闭应用程序主窗口时,标题栏仍然可见(因为它是代理应用程序)。现在菜单中的开关按钮不再响应,这意味着我无法打开或关闭它。如果双击它真的很快,你可以,但这不再是正常行为,它与隐藏窗口有关。正如我所说,如果窗口可见,它就可以工作。

有任何想法吗?谢谢!

标签: macosnsviewtitlebarnsmenunsmenuitem

解决方案


您需要在 NSSwitch 子类中将 acceptFirstMouse 作为 true 返回。

并将您的代码替换为

let switchButton = MySwitch(frame: frame)

这是子类。

class MySwitch: NSSwitch {
    override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
        return true
    }
}

推荐阅读