macOS菜单栏App调用togglePopover报AnyObject.Protocol类型错误如何解决
错误原因
你在调用togglePopover方法时传入了AnyObject(类型本身),而方法要求的参数是AnyObject类型的实例,因此触发了类型不匹配错误。
当前场景下是热键触发弹窗切换,没有对应的触发控件作为sender,无需传入实际的对象实例。
解决方案
最简修复
直接将AppDelegate中调用togglePopover的参数改为nil即可,NSPopover的相关方法原生支持接收nil作为sender参数:
KeyboardShortcuts.onKeyUp(for: .triggerPopover, action: { [weak self] in self?.statusBar?.togglePopover(sender: nil) })
额外优化:添加[weak self]避免闭包循环引用导致的内存泄漏。
类型规范优化(推荐)
你可以将StatusBarController中相关方法的sender参数改为可选类型,更符合Swift的类型安全规范,适配无触发sender的场景:
// 修改StatusBarController中的方法定义 @objc func togglePopover(sender: AnyObject?) { if popover.isShown { hidePopover(sender) } else { showPopover(sender) } } func showPopover(_ sender: AnyObject?) { if let statusBarButton = statusItem.button { popover.show(relativeTo: statusBarButton.bounds, of: statusBarButton, preferredEdge: .maxY) } } func hidePopover(_ sender: AnyObject?) { popover.performClose(sender) eventMonitor?.stop() }
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

