我在NSMenuItem中使用一个非常简单的自定义视图(仅包含一个只读NSTextField和一个NSSegmentedControl)(使用-setView:
方法)。这部分工作正常。
这里是问题:在-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];
}
}
我正在NSMenuItem中使用一个非常简单的自定义视图(仅包含一个只读NSTextField和一个NSSegmentedControl)(使用-setView:方法)。这部分工作正常。这是问题所在:...
除了隐藏项目,您是否可以根据需要删除/重新添加?
在菜单委托方法menu:updateItem:atIndex:shouldCancel中:我通过标签找到了我的自定义视图菜单项,如果它被隐藏,则将其视图设置为nil;如果可见,则将其分配给自定义视图:
我不得不重写NSMenuItem的setHidden:方法,如果隐藏,则将视图的高度设置为零,就像这样:
在Swift中,您可以覆盖isHidden
并相应地设置view
: