似乎无法在 NSMenuItem 上设置启用:否

Posted

技术标签:

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

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

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

我错过了什么?

【问题讨论】:

嘿,将您的解决方案作为答案发布,然后您可以在几天后接受它。 【参考方案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,那么您可以:

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

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

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

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

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

@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,但它也没有任何效果。

以上是关于似乎无法在 NSMenuItem 上设置启用:否的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义视图的 NSMenuItem 在滚动时消失

如何在 Xamarin/Android 上启用多个 BLE 特征通知?

禁用 NSMenuItem

在显示主机菜单时更新 NSMenuItem

具有自定义视图的 NSMenuItem 不接收鼠标事件

如何设置 NSMenu/NSMenuItems 的字体?