5

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

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

4

5 回答 5

4

基本上,您创建类似 an 的东西NSButtonNSMenu然后使用NSToolbarItem'setView:方法将按钮嵌入到工具栏项中。

于 2009-09-30T18:41:43.917 回答
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]];
}
于 2009-09-30T18:39:45.810 回答
3

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

在Interface Builder 3.2.1中(我不知道这个能力是什么时候真正引入的),你可以在nib窗口中向下钻取到对象分层列表中的工具栏,然后将一个弹出按钮从Library调色板拖到列表中的工具栏。IB 将为您将按钮包装在工具栏项中。

于 2009-09-30T23:59:44.447 回答
3

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

于 2010-04-02T23:18:45.357 回答
2

假设menu是一个NSMenu对象并且sender是一个NSToolbarItem,那么您需要做的就是传入sender.view以显示菜单。NSToolbarItem如果您已经设置了via Interface Builder ,则无需添加另一个视图。

[NSMenu popUpContextMenu:menu
               withEvent:[NSApp currentEvent]
                 forView:sender.view];
于 2015-08-10T18:46:14.830 回答