似乎无法在 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】:你可以不用子类化来解决这个问题。
如果您只需要标准菜单 + 一些可以在您的控件上禁用的自定义 NSMenuItem
s,那么您可以:
再添加一个菜单节点 - 只需将 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 上设置启用:否的主要内容,如果未能解决你的问题,请参考以下文章