似乎无法在NSMenuItem上设置setEnabled:NO

时间:2012-02-20 21:26:41

标签: cocoa nsmenuitem nsmenu

我已经将NSMenu子类化,并通过Interface Builder连接了一堆NSMenuItem。我已经通过调试器测试了它们是否真的被初始化了。

菜单设置为不自动启用项目。当我将我的任何NSMenuItem设置为[myMenuItem setEnabled:NO]时,它们仍将继续启用。即使我从NSMenu子类中调用[self update]

我错过了什么?

8 个答案:

答案 0 :(得分:56)

有同样的问题,所以我想我会发布我的解决方案。 NSMenu自动启用NSMenuButtons,因此我们必须覆盖它。

在IB:

You should uncheck "Auto Enables Items"

或以编程方式:

// 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)

enter image description here

您应取消选中最近的父级NSMenu

上的自动启用项

答案 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
        }
    }
}