【发布时间】:2009-09-30 18:05:08
【问题描述】:
我正在尝试从 NSToolbarItem 打开一个弹出菜单。我尝试遵循this 示例,但我不能使用该类方法,因为 NSToolbar 和 NSToolbarItem 继承自 NSObject 而不是 NSView。
除了创建自定义视图之外,从 NSToolbarItem 打开弹出菜单的最佳方式是什么?
【问题讨论】:
标签: objective-c cocoa nsmenu nstoolbar
我正在尝试从 NSToolbarItem 打开一个弹出菜单。我尝试遵循this 示例,但我不能使用该类方法,因为 NSToolbar 和 NSToolbarItem 继承自 NSObject 而不是 NSView。
除了创建自定义视图之外,从 NSToolbarItem 打开弹出菜单的最佳方式是什么?
【问题讨论】:
标签: objective-c cocoa nsmenu nstoolbar
基本上,您可以创建类似NSButton 的东西,并附加一个NSMenu,然后使用NSToolbarItem 的setView: 方法将按钮嵌入到toolbarItem 中。
【讨论】:
仅供参考:这篇文章已经结束了,但我只是在浏览,我有一个简单的方法,所以我想我会给出一个答案,以防其他人看到它。我发现我无法从库中将弹出按钮直接拖到 Interface Builder 中的工具栏上。但是,我可以将弹出按钮从窗口拖到工具栏上。所以我首先在窗口上创建弹出按钮,然后将它拖到工具栏上......它可以工作!其他对象也一样。
【讨论】:
只需在 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]];
}
【讨论】:
如果您想要工具栏项的实际弹出按钮,请将 NSPopUpButton 设置为工具栏项的视图。
在Interface Builder 3.2.1中(我不知道这个能力是什么时候真正引入的),你可以在nib窗口中向下钻取到对象分层列表中的工具栏,并从将库调色板放入列表中的工具栏。 IB 将为您将按钮包装在工具栏项中。
【讨论】:
假设menu 是NSMenu 对象,sender 是NSToolbarItem,那么您只需传入sender.view 即可显示菜单。如果您已经通过 Interface Builder 设置了NSToolbarItem,则无需添加其他视图。
[NSMenu popUpContextMenu:menu
withEvent:[NSApp currentEvent]
forView:sender.view];
【讨论】: