Swift macOS应用中MenuItem Action未执行问题求助
问题背景
我开发了一款macOS平台的Swift应用,应用包含带子菜单项的状态栏菜单。在AppDelegate中添加菜单并通过Interface Builder绑定Action后,点击对应菜单项时目标Action始终未被调用。
相关代码片段:
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength) if let menu = menu { statusItem?.menu = menu menu.delegate = self } pauseMenuItem.target = self pauseMenuItem.action = #selector(pausePressed(_:))
从IBAction左侧标记及Interface Builder界面可见绑定已完成:

可能的解决方向
检查Action方法签名:确保
pausePressed(_:)是被@objc dynamic修饰的实例方法,参数类型正确,示例:@objc dynamic func pausePressed(_ sender: NSMenuItem) { // 业务逻辑 }即使方法是
private,也必须加上@objc dynamic才能被Objective-C运行时识别调用。避免绑定方式冲突:不要同时在Interface Builder中绑定Action,又在代码里手动设置
target和action。选择其中一种方式即可——要么全靠IB绑定到AppDelegate的对应方法,要么完全通过代码设置,避免重复设置导致的冲突。确认子菜单的Target继承:如果
pauseMenuItem是父菜单的子项,父菜单的Target设置可能会覆盖子项的配置。可以在IB中直接给子菜单项明确指定Target为AppDelegate,或者在代码中确保父菜单没有干扰子项的Target设置。检查对象生命周期:确保
menu和pauseMenuItem是AppDelegate的强引用属性(比如声明为@IBOutlet var menu: NSMenu!、@IBOutlet var pauseMenuItem: NSMenuItem!),避免它们被提前释放导致事件无法传递。排查状态栏菜单事件传递:尝试设置
statusItem?.button?.target = self(针对状态栏按钮本身,可辅助排除全局事件传递问题),同时确保AppDelegate处于活跃状态。
内容的提问来源于stack exchange,提问作者Laurent Crivello

