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

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)


onm*_*133 10

在此输入图像描述

您应该取消选中最近的父NSMenu上的自动启用项目


小智 7

您无需子类化即可解决此问题。

如果您只需要标准菜单 + 一些NSMenuItem可以在您的控件上禁用的自定义s,那么您可以:

  1. 再添加一个菜单节点 - 只需将子菜单菜单项从对象库拖放到您的菜单中即可。

  2. 将您想要管理的所有 NSMenuItems 添加到这个新的 Menu 节点。

  3. 打开新菜单节点的属性检查器,并关闭自动启用项目选项:

    自动启用项目

  4. 配置菜单和项目的任何其他选项。

现在您可以编写如下代码:

@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem;
...
[self.hidePlateMenuItem setEnabled:NO];
Run Code Online (Sandbox Code Playgroud)

它会运作良好。


Yan*_*rck 5

如果菜单项位于一个或多个子菜单中,则仅需取消选中该菜单项子菜单中的“自动启用项”属性,而无需其他任何父菜单,就可以增加其响应。