2011-05-03 106 views
4

我在NSMenuItem(使用-setView:方法)中使用了一个非常简单的自定义视图(仅包含只读NSTextField和NSSegmentedControl)。这部分按预期工作。如何隐藏自定义视图的菜单项?

下面是问题:在-menuNeedsUpdate: NSMenu委托方法我有条件地隐藏菜单项。当我打电话给[item setHidden:YES]时,具有自定义视图的菜单项不会隐藏,但其他“香草”菜单项却可以。

我的自定义视图是在它自己的XIB中构建的,我通过自定义的NSViewController访问它。即使我检查在Interface Builder中隐藏复选框,并删除它是隐藏在代码行

更新

菜单项保持可见。

更新2

我也尝试过和菜单项设置hidden后的自定义视图设置hidden。结果就好像菜单项不隐藏,但视图是;视图的控件不可见,但它们应该存在差距。

更新3

我修改苹果的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]; 
    } 
} 

回答

1

而不是隐藏的物品,可以删除/重根据需要添加?

[rootMenu removeItemAtIndex: 23]; 
+0

我试图摆脱这个特定的控制器没有任何引用特定的菜单项,但这可能是最好的方式去。 – Dov 2011-05-03 16:21:56

+1

我必须承认有一个很深的偏见:完成它,运送它,准确地确定它为什么做/不作为读者的练习。祝你好运。 – Rayfleck 2011-05-03 16:37:48

+0

阿门,@Mike。阿门。 – Dov 2011-05-03 16:47:01

0

我不得不重写NSMenuItem的setHidden:方法,如果隐藏在视图的高度设置为零,像这样:

- (void) setHidden:(BOOL)flag { 

[super setHidden:flag]; 

NSView *view = [self view]; 
[view setHidden:flag]; 

// if our view is hidden, give it a zero height so it won't draw at all 
if (flag) 
    [view setFrameSize:NSMakeSize([view frame].size.width, 0)]; 
else { 

    [view setFrameSize:NSMakeSize([view frame].size.width, [self menuItemHeight])]; 
} 

}

+0

'menuItemHeight'在哪里定义?我没有在NSMenuItem的文档中看到它。 – Dov 2011-05-03 18:42:30

+0

这是我自己的方法(我认为默认高度是19.0,您可以替换它) – 2011-05-03 19:02:35

0

在菜单的委托方法菜单:的updateItem:atIndex: shouldCancel:通过标签找到我的自定义视图菜单项,并将其视图设置为零,如果它隐藏或指定自定义视图如果可见:

- (BOOL)menu:(NSMenu *)menu 
    updateItem:(NSMenuItem *)item 
    atIndex:(NSInteger)index 
    shouldCancel:(BOOL)shouldCancel 
{ 

    if ([item tag] == CUSTOM_VIEW_TAG) 
    { 
     [item setView:[item isHidden]?nil:customView]; 
     return NO; //we've done our dirty work 
    } 

    return YES; 
}