如何为NSToolbarItem添加一个弹出菜单?

6

我正在尝试从NSToolbarItem打开一个弹出菜单。 我尝试了这个示例,但我无法使用该类方法,因为NSToolbar和NSToolbarItem继承自NSObject而不是NSView。

除了创建自定义视图之外,从NSToolbarItem打开弹出菜单的最佳方法是什么?

5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4

基本上,您需要创建一个类似于NSButton的东西,并将其附加到NSMenu,然后使用NSToolbarItemsetView:方法将按钮嵌入到工具栏项中。


为什么不将菜单添加到视图中,再将视图添加到工具栏项中呢? - ruipacheco
@Rui不就是我建议的吗? :/ - Dave DeLong

3

在IB中创建一个带有所需菜单的NSView。然后在您的窗口控制器中,添加以下代码:

// This assumes you have a window property pointing to the window to which you'll
// add the toolbar. It also assumes you've connected the NSView to add to the
// toolbar to a member called toolbarView.

- (NSArray*)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar {
    return [NSArray arrayWithObject:@"myToolbarMenu"];
}

- (NSArray*)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar {
    return [self toolbarAllowedItemIdentifiers:toolbar];
}

- (NSToolbarItem*)toolbar:(NSToolbar*)toolbar
    itemForItemIdentifier:(NSString*)str
willBeInsertedIntoToolbar:(BOOL)flag
{
    if ([str isEqualToString:@"myToolbarMenu"] == YES) {
        NSToolbarItem* item = [[NSToolbarItem alloc] initWithItemIdentifier:str];
        [item setView:toolbarView];
        [item setMinSize:[toolbarView frame].size];
        [item setMaxSize:[toolbarView frame].size];
        return [item autorelease];  
    }
    return nil;
}

- (void)windowDidLoad {
    NSToolbar* toolbar = [[NSToolbar alloc] initWithIdentifier:@"myToolbar"];
    [toolbar setDelegate:self];
    [self.window setToolbar:[toolbar autorelease]];
}

3

提醒:这篇文章已经过时,但我只是在浏览,我有一个简单的方法,所以我想给出一个答案,以防其他人查看。我发现我无法直接从库中将弹出式按钮拖到Interface Builder中的工具栏。但是,我可以从窗口将弹出式按钮拖到工具栏中。因此,我首先在窗口上创建弹出式按钮,然后将其拖到工具栏上...它有效!其他对象也是如此。


直到出现绿色勾号,有时甚至连那都不算结束。☺ 无论如何,在3.2.1中,我不能按照你建议的方式完成它,所以我会编辑我的答案,包括我完成它的方式。 - Peter Hosey
在3.2.1中,我可以直接从库将弹出式按钮拖到工具栏上。但是,我仍然可以从窗口将其拖到工具栏上。要做到这一点,请确保工具栏未打开,如果它已经打开,请单击“完成”按钮。然后将弹出式按钮从窗口拖到工具栏上,并悬停一会儿......工具栏将打开,您可以在其中释放按钮。我认为这种方法更容易,因为似乎更容易在窗口上配置按钮,而不是在工具栏菜单中。 - regulus6633
regulus6633:哦,你是说将它拖到“配置工具栏”表单中!我甚至不知道在IB中可以打开它(“什么‘完成’按钮?”)。既然我打开了那个表单,我就能直接从库中将控件拖到其中。而且你说得对,这样做要容易得多 - Peter Hosey

3

如果您想要一个实际的弹出式按钮用于工具栏项,请将NSPopUpButton设置为工具栏项的视图。

在Interface Builder 3.2.1中(我不知道这个功能实际上是什么时候引入的),您可以在nib窗口中对象的分层列表中深入到工具栏,并从库面板中将弹出式按钮拖入列表中的工具栏。IB会为您包装按钮,使其成为工具栏项。


2
假设 menu 是一个 NSMenu 对象,sender 是一个 NSToolbarItem,那么您只需要将 sender.view 传递给显示菜单即可。如果您已经通过 Interface Builder 设置了 NSToolbarItem,则无需添加其他视图。请注意保留 HTML 标签。
[NSMenu popUpContextMenu:menu
               withEvent:[NSApp currentEvent]
                 forView:sender.view];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,