我已经通过 Interface BuilderNSMenu
对一堆 's 进行了子类化和连接。NSMenuItem
我已经通过调试器进行了测试,看看它们真的被初始化了。
菜单设置为不自动启用项目。仍然当我将任何 NSMenuItem 设置为时,[myMenuItem setEnabled:NO]
它们仍会继续启用。即使我[self update]
从 NSMenu 子类中调用。
我错过了什么?
我已经通过 Interface BuilderNSMenu
对一堆 's 进行了子类化和连接。NSMenuItem
我已经通过调试器进行了测试,看看它们真的被初始化了。
菜单设置为不自动启用项目。仍然当我将任何 NSMenuItem 设置为时,[myMenuItem setEnabled:NO]
它们仍会继续启用。即使我[self update]
从 NSMenu 子类中调用。
我错过了什么?
有同样的问题,所以我想我会发布我的解决方案。NSMenu auto 启用 NSMenuButtons,所以我们必须覆盖它。
在 IB 中:
或以编程方式:
// Disable auto enable
[myMenu setAutoenablesItems:NO];
// Test it
[myMenuButton setEnabled:NO];
[myMenuButton setEnabled:YES];
我在同事的帮助下解决了这个问题,所以我在这里发布给遇到同样问题的其他人。
您应该将 NSMenu-sublass 设置为自动启用项目(默认行为),然后在 NSMenu-sublass 中实现此方法。
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
return [menuItem isEnabled];
}
您可以在没有子类化的情况下解决这个问题。
如果您只需要标准菜单+一些NSMenuItem
可以在您的控件上禁用的自定义s,那么您可以:
再添加一个菜单节点 - 只需将子菜单菜单项从对象库拖放到您的菜单中。
将您要管理的所有 NSMenuItem 添加到这个新的菜单节点。
打开新菜单节点的属性检查器,然后关闭自动启用项目选项:
配置菜单和项目的任何其他选项。
现在您可以编写如下代码:
@property (weak) IBOutlet NSMenuItem *hidePlateMenuItem;
...
[self.hidePlateMenuItem setEnabled:NO];
它会运作良好。
添加到 itsdavyh 的响应中,如果菜单项位于一个或多个子菜单内,您只需取消选中菜单项子菜单上的“自动启用项目”属性,而不是任何其他父菜单。
我尝试了所有这些解决方案,但最后我发现了对我来说更有意义的真正问题。它也是处理禁用的 nsmenuitem 的最简单方法,无需子类化或编写代码。之前作为菜单本身子项的 nsmenuitem 是主项的子项,例如“另存为...”是“文件”的子项。只需选择父项(在本例中为文件)并在菜单 isspector 面板中设置“自动启用菜单项”,就可以了!
斯威夫特 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
}
}
}
尝试 [myMenuItem setEnabled:NO]
从不同的地方调用,并确保它在包含菜单的笔尖加载后发生。也许在子类 NSMenu 中做对awakeFromNib
。