2009-09-30 74 views
3

我试图从NSToolbarItem打开一个弹出式菜单。我尝试了以下this示例,但我不能使用该类方法,因为NSToolbar和NSToolbarItem从NSObject继承,而不是从NSView继承。如何将弹出菜单添加到NSToolbarItem?

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

回答

3

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

+0

除非出现绿色复选标记,否则没有任何结果,有时甚至不会。 ☺无论如何,在3.2.1中,我无法按照您的建议进行操作,所以我会编辑我的答案以包含我做到的方式。 – 2010-04-04 05:05:11

+0

在3.2.1中,我可以直接将弹出按钮拖动到库中的工具栏上。不过,我仍然可以从窗口拖动一个到工具栏。要做到这一点,确保工具栏没有打开,只要点击“完成”按钮即可。然后将窗口中的弹出按钮拖动到工具栏上并将鼠标悬停在其上一会儿......工具栏将打开,您可以在工具栏中释放该按钮。我认为这种方法比较容易,因为在窗口上而不是在工具栏菜单中配置按钮似乎更容易。 – regulus6633 2010-04-04 12:50:52

+0

regulus6633:哦,你的意思是将它拖到配置工具栏表!我甚至不知道有可能在IB中提出这个问题(“What'Done'按钮?”)。现在我已经打开了该工作表,我可以直接从库中将控件拖入其中。你说得对,这很容易。 – 2010-04-05 10:45:02

3

只需在你的菜单中创建一个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

基本上,你创造的东西像一个NSButton具有附加给它的NSMenu,然后使用NSToolbarItemsetView:方法嵌入在toolbarItem按钮。

+0

为什么不将菜单添加到视图和工具栏项目的视图? – ruipacheco 2009-12-17 21:33:18

+0

@Rui是不是我所说的? :/ – 2009-12-17 21:56:37

3

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

在界面生成器3.2.1中(我不知道这个功能是什么时候被引入的),你可以深入到nib窗口中对象的分层列表中的工具栏,并从中弹出一个弹出按钮库调色板放入列表中的工具栏中。 IB会将按钮包装在工具栏项目中。

0

假设menuNSMenu对象,senderNSToolbarItem,那么所有你需要做的是通过在sender.view,显示菜单。如果您已经通过Interface Builder设置了NSToolbarItem,则无需添加其他视图。

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