4

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

这是问题所在:在-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];
    }
}
4

4 回答 4

1

Rather than hiding an item, can you remove/re-add as needed?

 [rootMenu removeItemAtIndex: 23];
于 2011-05-03T16:20:32.157 回答
1

In menu delegate method menu:updateItem:atIndex:shouldCancel: i find my custom view menu item by tag and set it's view to nil if it is hidden or assign custom view if visible:

- (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;
}
于 2012-03-09T00:24:13.723 回答
1

In Swift, you can override isHidden and set view accordingly:

class PositionHeaderMenuItem: NSMenuItem {
    let customView = SomeCustomView()

    override var isHidden: Bool {
        didSet {
            if isHidden {
                view = nil
            } else {
                view = customView
            }
        }
    }
}
于 2020-06-09T05:05:34.097 回答
0

I had to override NSMenuItem's setHidden: method and set the view's height to zero if hidden, like so:

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

}

于 2011-05-03T18:05:27.803 回答