首页 文章

如何使用自定义视图隐藏菜单项?

提问于
浏览
4

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

这是问题所在:在 -menuNeedsUpdate: NSMenu委托方法中,我有条件地隐藏了菜单项 . 当我调用 [item setHidden:YES] 时,带有自定义视图的菜单项不会't hide, but other '香草'菜单项 .

我的自定义视图是在自己的XIB中构建的,我通过自定义的NSViewController访问它 .

Update

即使我在Interface Builder中选中隐藏复选框,菜单项仍然可见,并删除它隐藏在代码中的行 .

Update 2

我还尝试在菜单项上设置 hidden 之前和之后在自定义视图上设置 hidden . 结果就好像菜单项没有隐藏,但视图是;视图's controls aren' t可见,但它们应该存在差距 .

Update 3

我修改了Apple的MenuItemView示例代码,以便在添加之后隐藏其中一个菜单项(在第87行插入 [menuItem setHidden:YES]; ),它与我的代码具有相同的效果(也就是说,没有) .

我开始认为隐藏此菜单项的唯一方法是将其视图设置为 nil ,当我需要隐藏它并在需要显示时将其放回去,但似乎不应该是必要的 .

Update 4

使用Mike的答案,下面是我正在使用的代码:

// 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];
    }
}

3 回答

  • 0

    您可以根据需要删除/重新添加,而不是隐藏项目吗?

    [rootMenu removeItemAtIndex: 23];
    
  • 1

    我必须覆盖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

    在菜单委托方法菜单中:updateItem:atIndex:shouldCancel:我按标签找到我的自定义视图菜单项,如果隐藏则将其视图设置为nil,或者如果可见则指定自定义视图:

    - (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;
    }
    

相关问题