-setView:
我在 NSMenuItem(使用方法)中使用了一个非常简单的自定义视图(仅包含一个只读的 NSTextField 和一个 NSSegmentedControl )。这部分按预期工作。
这是问题所在:在-menuNeedsUpdate:
NSMenu 委托方法中,我有条件地隐藏了菜单项。当我调用[item setHidden:YES]
时,具有自定义视图的菜单项不会隐藏,但其他“香草”菜单项会隐藏。
我的自定义视图构建在它自己的 XIB 中,我通过自定义 NSViewController 访问它。
更新
即使我在 Interface Builder 中选中 Hidden 复选框,菜单项仍然可见,并删除它在代码中隐藏的行。
更新 2
我还尝试在设置菜单项hidden
之前和之后设置自定义视图。hidden
结果好像菜单项没有隐藏,但视图是;视图的控件是不可见的,但它们应该在的地方仍然存在差距。
更新 3
我修改了 Apple 的MenuItemView示例代码,以在添加后隐藏其中一个菜单项(在第 87 行插入[menuItem setHidden:YES];
),它与我的代码中的效果相同(也就是说,没有)。
我开始认为隐藏此菜单项的唯一方法是将其视图设置nil
为何时需要隐藏它并在需要显示它时将其放回原处,但这似乎没有必要。
更新 4
使用下面迈克的回答,这是我正在使用的代码:
// Declared in the header file
IBOutlet NSMenuItem *previousMenuItem;
IBOutlet NSMenuItem *togglingMenuItem; //Needs to be RETAINED
. . .
- (void)menuNeedsUpdate:(NSMenu *)menu {
BOOL hideItem = YES; // Some criteria, obviously
// Remove the menu item, if it was already present
if ([menu indexOfItem:togglingMenuItem] >= 0) {
[menu removeItem:togglingMenuItem];
}
// Put it back if it should be visible
if (!onePageVisible) {
[menu insertItem:togglingMenuItem
atIndex:[menu indexOfItem:previousMenuItem] + 1];
}
}