You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:39:02