如何将弹出菜单添加到NSToolbarItem?

时间:2009-09-30 18:05:08

标签: objective-c cocoa nsmenu nstoolbar

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

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

5 个答案:

答案 0 :(得分:4)

基本上,您创建了NSButton附加了NSMenu的内容,然后使用NSToolbarItem的{​​{1}}方法将该按钮嵌入到toolbarItem中。

答案 1 :(得分: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]];
}

答案 2 :(得分:3)

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

在Interface Builder 3.2.1中(我不知道这个功能何时被实际引入),你可以深入到nib窗口中对象的分层列表中的工具栏,然后从中弹出一个弹出按钮。库调色板进入列表中的工具栏。 IB会将按钮包装在工具栏中。

答案 3 :(得分:3)

仅供参考:这篇文章已经结束了,但我只是在浏览,我有一个简单的方法,所以我想我会给出一个答案,万一其他人看一看。我发现无法将弹出按钮直接拖到Interface Builder中的工具栏中。但是,我可以将弹出按钮从窗口拖到工具栏。所以我首先在窗口上创建弹出按钮,然后将其拖动到工具栏......它可以工作!与其他对象相同。

答案 4 :(得分:1)

假设menuNSMenu个对象且senderNSToolbarItem,那么您需要做的就是传递sender.view以显示菜单。如果您已通过Interface Builder设置NSToolbarItem,则无需添加其他视图。

[NSMenu popUpContextMenu:menu
               withEvent:[NSApp currentEvent]
                 forView:sender.view];