macos - 如果窗口不可见,则在 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
}
只要应用程序窗口集中,它就可以很好地工作。
当我关闭应用程序主窗口时,标题栏仍然可见(因为它是代理应用程序)。现在菜单中的开关按钮不再响应,这意味着我无法打开或关闭它。如果双击它真的很快,你可以,但这不再是正常行为,它与隐藏窗口有关。正如我所说,如果窗口可见,它就可以工作。
有任何想法吗?谢谢!
解决方案
您需要在 NSSwitch 子类中将 acceptFirstMouse 作为 true 返回。
并将您的代码替换为
let switchButton = MySwitch(frame: frame)
这是子类。
class MySwitch: NSSwitch {
override func acceptsFirstMouse(for event: NSEvent?) -> Bool {
return true
}
}
推荐阅读
- javascript - pinterest 可以有多个用户定义的事件吗?
- boost-asio - spawn 和 post 如何与 asio 一起工作?
- firebase - 我想在用户 ID 下发送数据并获取相同的数据
- c++ - 为什么答案是垃圾值?
- r - 使用 rvest 在 R 中获取坐标的编码问题?
- python - 以用户身份登录时如何使用 Telethon 在消息下创建按钮
- html - Angular 9 和 HTML5 背景视频不会在 iOS 13 上自动播放(无论浏览器如何)
- javascript - 计算文本区域中特定单词的出现次数 (JavaScript)
- css - 用于在 id 内编号的 css 属性选择器
- regex - 正则表达式匹配 sed 中的非 ASCII 字符