23

我已经通过 Interface BuilderNSMenu对一堆 's 进行了子类化和连接。NSMenuItem我已经通过调试器进行了测试,看看它们真的被初始化了。

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

我错过了什么?

4

8 回答 8

72

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

在 IB 中:

你应该取消选中

或以编程方式:

// Disable auto enable
[myMenu setAutoenablesItems:NO];

// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];
于 2013-05-06T22:49:18.310 回答
12

我在同事的帮助下解决了这个问题,所以我在这里发布给遇到同样问题的其他人。

您应该将 NSMenu-sublass 设置为自动启用项目(默认行为),然后在 NSMenu-sublass 中实现此方法。

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
    return [menuItem isEnabled];
}
于 2012-02-23T22:51:37.153 回答
11

在此处输入图像描述

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

于 2017-03-05T20:37:45.953 回答
7

您可以在没有子类化的情况下解决这个问题。

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

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

  2. 将您要管理的所有 NSMenuItem 添加到这个新的菜单节点。

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

    自动启用项目

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

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

@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem;
...
[self.hidePlateMenuItem setEnabled:NO];

它会运作良好。

于 2013-02-20T10:01:28.000 回答
5

添加到 itsdavyh 的响应中,如果菜单项位于一个或多个子菜单内,您只需取消选中菜单项子菜单上的“自动启用项目”属性,而不是任何其他父菜单。

于 2013-12-20T17:16:35.583 回答
1

我尝试了所有这些解决方案,但最后我发现了对我来说更有意义的真正问题。它也是处理禁用的 nsmenuitem 的最简单方法,无需子类化或编写代码。之前作为菜单本身子项的 nsmenuitem 是主项的子项,例如“另存为...”是“文件”的子项。只需选择父项(在本例中为文件)并在菜单 isspector 面板中设置“自动启用菜单项”,就可以了!

于 2013-11-11T14:50:48.533 回答
1

斯威夫特 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
        }
    }
}
于 2017-04-21T20:39:18.897 回答
0

尝试 [myMenuItem setEnabled:NO]从不同的地方调用,并确保它在包含菜单的笔尖加载后发生。也许在子类 NSMenu 中做对awakeFromNib

于 2012-02-21T00:55:00.530 回答