我已经将NSMenu
子类化,并通过Interface Builder连接了一堆NSMenuItem
。我已经通过调试器测试了它们是否真的被初始化了。
菜单设置为不自动启用项目。当我将我的任何NSMenuItem设置为[myMenuItem setEnabled:NO]
时,它们仍将继续启用。即使我从NSMenu子类中调用[self update]
。
我错过了什么?
答案 0 :(得分:56)
有同样的问题,所以我想我会发布我的解决方案。 NSMenu自动启用NSMenuButtons,因此我们必须覆盖它。
在IB:
或以编程方式:
// Disable auto enable
[myMenu setAutoenablesItems:NO];
// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];
答案 1 :(得分:12)
我在同事的帮助下解决了这个问题,因此我将其发布在其他遇到同样问题的人身上。
您应该将NSMenu子类设置为自动启用项(默认行为),然后在NSMenu子类中实现此方法。
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
return [menuItem isEnabled];
}
答案 2 :(得分:9)
答案 3 :(得分:4)
您可以在不进行子类化的情况下解决此问题。
如果您需要的是标准菜单+某些可以在您的控件上禁用的自定义NSMenuItem
,那么您可以:
1)再添加一个菜单节点 - 只需将子菜单菜单项从对象库拖放到菜单中即可。
2)将您要管理的所有NSMenuItem添加到此新菜单节点。
3)打开New Menu节点的属性检查器,然后关闭Auto Enables Items选项:
http://i.imgur.com/YLZKFam.jpg(请在此处查看图片,我现在无法直接发布)。
4)配置菜单的其他选项&项目。
现在您可以编写如下代码:
@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem;
...
[self.hidePlateMenuItem setEnabled:NO];
它会很好用。
答案 4 :(得分:4)
如果菜单项位于一个或多个子菜单中,则只需在菜单项的子菜单中取消选中“自动启用项目”属性,而不是在任何其他父菜单上,添加到其子项的响应中。
答案 5 :(得分:0)
尝试从其他位置调用[myMenuItem setEnabled:NO]
并确保在加载包含菜单的nib后发生。也许在子类NSMenu的awakeFromNib
中做正确的事。
答案 6 :(得分:0)
我尝试了所有这些解决方案,但最后我发现了对我来说更有意义的真正问题。 它也是处理禁用的nsmenuitem的最简单方法,无需子类或代码。 作为菜单本身的孩子之前的nsmenuitem是主要项目的孩子,例如“另存为...”是“文件”的孩子。只需选择父项(在此示例中为File)并在菜单ispector面板中设置“自动启用菜单项”,然后就可以了!
答案 7 :(得分:0)
斯威夫特3回答:
我在标准的“视图”菜单下有一个子菜单项,名为“启动时启用系统设置”。我使用下面的函数来启用或禁用菜单项。注意:视图菜单确实需要关闭IB中的“自动启用项目”。
func enableSystemSetupMenuItem(enabled:Bool) {
//set view menu item to enabled: value
//requires "Auto Enable Items" of "View" menu item to be turned off in IB
//because "View" menu is now turned off for "Auto Enable" we have to handle all
//of the "View" menu items ourselves
//just to avoid operating on menu separators I set all other menu items to TAG = -1
let main = NSApplication.shared().menu?.item(withTitle: "View")
let subMenuItems = main?.submenu?.items
for item in subMenuItems! {
if item.title == "Enable System Setup On Launch" {
item.isEnabled = enabled
} else if item.tag == -1 {
item.isEnabled = true
}
}
}