Chr*_*fer 20 cocoa nsmenu nsmenuitem
我通过Interface Builder 进行了子类化NSMenu和连接NSMenuItem.我已经通过调试器测试了它们是否真的被初始化了.
菜单设置为不自动启用项目.仍然当我设置我的任何NSMenuItem时,[myMenuItem setEnabled:NO]它们仍然被启用.即使我[self update]从NSMenu子类内部调用.
我错过了什么?
vqd*_*ave 62
有同样的问题,所以我想我会发布我的解决方案.NSMenu自动启用NSMenuButtons,因此我们必须覆盖它.
在IB中:

或以编程方式:
// Disable auto enable
[myMenu setAutoenablesItems:NO];
// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];
Run Code Online (Sandbox Code Playgroud)
Chr*_*fer 12
我在一位同事的帮助下解决了这个问题,因此我将其发布给其他遇到同样问题的人.
您应该将NSMenu子类设置为自动启用项(默认行为),然后在NSMenu子类中实现此方法.
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
return [menuItem isEnabled];
}
Run Code Online (Sandbox Code Playgroud)
小智 7
您无需子类化即可解决此问题。
如果您只需要标准菜单 + 一些NSMenuItem可以在您的控件上禁用的自定义s,那么您可以:
再添加一个菜单节点 - 只需将子菜单菜单项从对象库拖放到您的菜单中即可。
将您想要管理的所有 NSMenuItems 添加到这个新的 Menu 节点。
打开新菜单节点的属性检查器,并关闭自动启用项目选项:
配置菜单和项目的任何其他选项。
现在您可以编写如下代码:
@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem;
...
[self.hidePlateMenuItem setEnabled:NO];
Run Code Online (Sandbox Code Playgroud)
它会运作良好。