【问题标题】:Cannot seem to setEnabled:NO on NSMenuItem似乎无法在 NSMenuItem 上设置启用:否
【发布时间】:2012-03-11 05:42:23
【问题描述】:

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

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

我错过了什么?

【问题讨论】:

  • 嘿,将您的解决方案作为答案发布,然后您可以在几天后接受它。

标签: cocoa nsmenuitem nsmenu


【解决方案1】:

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

在 IB 中:

或以编程方式:

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

// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];

【讨论】:

  • 8 年后这个答案仍然有意义?
【解决方案2】:

我在同事的帮助下解决了这个问题,所以我将它发布在这里以供遇到相同问题的其他人使用。

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

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
    return [menuItem isEnabled];
}

【讨论】:

    【解决方案3】:

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

    上的 Auto Enables Items

    【讨论】:

      【解决方案4】:

      你可以不用子类化来解决这个问题。

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

      1. 再添加一个菜单节点 - 只需将 Submenu Menu Item 从 Object library 拖放到您的菜单中。

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

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

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

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

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

      它会运作良好。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            斯威夫特 3 答案:

            我在标准“查看”菜单下有一个名为“启动时启用系统设置”的子菜单项。我使用下面的功能来启用或禁用菜单项。注意:视图菜单确实需要关闭IB中的“Auto Enable Items”。

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

              • 我做了一些快速测试,发现 awakeFromNib 总是在 [myMenuItem setEnabled:NO] 之前运行。正如您所建议的,我尝试更新 awakeFromNib 中的 menuItem,但它也没有任何效果。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-23
              • 2012-05-11
              • 2011-10-11
              • 1970-01-01
              • 2021-01-30
              • 1970-01-01
              相关资源
              最近更新 更多