【发布时间】:2011-05-03 14:08:34
【问题描述】:
我在 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];
}
}
【问题讨论】:
标签: objective-c cocoa macos nsmenuitem nsmenu