Xcode 9中创建MacOS应用菜单项始终禁用问题求助
我之前也踩过Xcode 9这个坑!别慌,咱们从几个常见的排查点入手,一步步解决:
检查方法签名的一致性
Xcode 9对First Responder的方法匹配要求更严格了。确保你代码里的方法签名和First Responder中添加的完全一致,包括返回类型、参数类型和名称。比如代码里是:- (IBAction)myCustomMenuAction:(id)sender;那First Responder里添加的方法必须一模一样,不能少参数或者改类型。
手动添加First Responder方法(别依赖拖拽)
有时候Xcode 9的拖拽功能会出问题,不如手动添加更可靠:- 打开Main.storyboard,找到First Responder对象
- 切换到Identity Inspector(右侧面板的第三个图标)
- 在Custom Class区域的“Actions”里,点击+号,输入和代码中完全一致的方法签名
- 再把菜单项拖到First Responder上,选择刚添加的方法
验证菜单项的连接指向
右键点击菜单项,检查它的“Selector”是否正确关联到First Responder的目标方法,而不是某个具体的实例对象。如果连接到了一个当前不在响应链上的实例,菜单项就会被禁用。检查validateMenuItem方法
如果你的类里实现了- (BOOL)validateMenuItem:(NSMenuItem *)menuItem方法,一定要确保针对这个菜单项返回YES。Xcode 9下这个方法的优先级更高,不小心返回NO的话直接会让菜单项灰掉。清理缓存并重启Xcode
有时候是Xcode的缓存搞的鬼:选择Product -> Clean Build Folder(按住Option键可以看到这个选项),然后重启Xcode,重新连接菜单项试试。确认响应链是否包含能处理方法的对象
运行App后,在调试控制台输入:po [NSApp keyWindow].firstResponder查看当前的第一响应者是不是你实现了目标方法的类实例(比如ViewController或者AppDelegate),如果不是,可能需要调整视图的响应链设置。
内容的提问来源于stack exchange,提问作者JoseIgnacio

