我正在尝试从 NSToolbarItem 打开一个弹出菜单。我尝试按照这个示例进行操作,但我不能使用该类方法,因为 NSToolbar 和 NSToolbarItem 继承自 NSObject 而不是 NSView。
除了创建自定义视图之外,从 NSToolbarItem 打开弹出菜单的最佳方法是什么?
我正在尝试从 NSToolbarItem 打开一个弹出菜单。我尝试按照这个示例进行操作,但我不能使用该类方法,因为 NSToolbar 和 NSToolbarItem 继承自 NSObject 而不是 NSView。
除了创建自定义视图之外,从 NSToolbarItem 打开弹出菜单的最佳方法是什么?
基本上,您创建类似 an 的东西NSButton
,NSMenu
然后使用NSToolbarItem
'setView:
方法将按钮嵌入到工具栏项中。
只需使用您想要的菜单在 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窗口中向下钻取到对象分层列表中的工具栏,然后将一个弹出按钮从Library调色板拖到列表中的工具栏。IB 将为您将按钮包装在工具栏项中。
仅供参考:这篇文章已经结束了,但我只是在浏览,我有一个简单的方法,所以我想我会给出一个答案,以防其他人浏览它。我发现我无法从库中将弹出按钮直接拖到 Interface Builder 的工具栏上。但是,我可以将弹出按钮从窗口拖到工具栏上。所以我首先在窗口上创建弹出按钮,然后将它拖到工具栏上......它可以工作!与其他对象相同。
假设menu
是一个NSMenu
对象并且sender
是一个NSToolbarItem
,那么您需要做的就是传入sender.view
以显示菜单。NSToolbarItem
如果您已经设置了via Interface Builder ,则无需添加另一个视图。
[NSMenu popUpContextMenu:menu
withEvent:[NSApp currentEvent]
forView:sender.view];