有没有办法从NSToolBarItem实现弹出菜单?

时间:2014-08-04 00:41:59

标签: cocoa nstoolbar nstoolbaritem

我正在尝试实现一个弹出式菜单(在Chrome中可以看到的东西,当光标在左箭头上时,我按下鼠标右键)。

我有一个派生自NSToolBarItem的类,我有另一个派生自NSToolBar的类。在工具栏中,我调用了setAllowsUserCustomization。所以我右键单击工具栏上的任意位置都会显示工具栏的自定义菜单。

感谢您提供任何指针。

2 个答案:

答案 0 :(得分:2)

您不需要继承NSToolbarItem。只需给出一个工具栏项its own view(代码或IB)。在该视图中,您可以使用像NSPopUpButton这样的标准控件,或者使用您喜欢的任何事件处理逻辑的自定义视图。

答案 1 :(得分:0)

如果您希望NSToolbarItem自定义视图接收mouseDown事件,您可以遵循以下模式:使用自定义NSWindow子类(或调整-[NSWindow hitTest:]方法)并自行将事件转发给您的视图。

// MyWindow.h

@interface MyWindow : NSWindow

@end

@interface NSView (MyWindow)

- (BOOL)interceptsToolbarRightMouseDownEvents;

@end

// MyWindow.m

@implementation NSView (MyWindow)

- (BOOL)interceptsToolbarRightMouseDownEvents { // overload in your custom toolbar item view return YES
    return NO;
}

@end

@interface NSToolbarView : NSView /* this class is hidden in AppKit */ @end

@implementation MyWindow

- (void)sendEvent:(NSEvent*)event {
    if (event.type == NSRightMouseDown) {
        NSView* frameView = [self.contentView superview];
        NSView* view = [frameView hitTest:[frameView convertPoint:event.locationInWindow fromView:nil]];
        if ([view isKindOfClass:NSToolbarView.class])
            for (NSView* subview in view.subviews) {
                NSView* view = [subview hitTest:[subview convertPoint:event.locationInWindow fromView:nil]];
                if (view.interceptsToolbarRightMouseDownEvents)
                    return [view rightMouseDown:event];
            }
    }

    [super sendEvent:event];
}

@end