如何隐藏具有自定义视图的菜单项?

问题描述 投票:4回答:4

我在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:方法)。这部分工作正常。这是问题所在:...

objective-c cocoa macos nsmenuitem nsmenu
4个回答
1
投票

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


1
投票

在菜单委托方法menu:updateItem:atIndex:shouldCancel中:我通过标签找到了我的自定义视图菜单项,如果它被隐藏,则将其视图设置为nil;如果可见,则将其分配给自定义视图:


0
投票

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


0
投票

在Swift中,您可以覆盖isHidden并相应地设置view

© www.soinside.com 2019 - 2024. All rights reserved.