我想在工具栏中的NSPopover
按钮上显示NSToolbarItem
(即位于按钮下方)。
理想情况下,我想将按钮的NSView
传递给弹出窗口以定位它
我的问题是,如何获得NSView
的{{1}}?
NSToolbarItem
总是返回nil。
答案 0 :(得分:6)
答案似乎出现在2011年WWDC会议113的视频中,"全屏和Aqua变化。"基本上,将NSButton放在NSToolbaritem中并使用它的视图。
博客文章位于:http://www.yellowfield.co.uk/blog/?p=33,示例项目位于github http://github.com/tevendale/ToolbarPopover
所有精神都在http://xkcd.com/979!
答案 1 :(得分:2)
您可以直接从NSButton
中包含的NSToolbarItem
发送操作(这通常是您应该做的事情,请考虑细分控件,每个细分都有自己的目标/操作),以及这将成功。
答案 2 :(得分:2)
不是从IBAction发件人那里获取视图,而是将IBOutlet直接连接到工具栏项并使用它来获取相对视图:
在您的标头文件中:
@property (weak) IBOutlet NSToolbarItem *theToolbarItem;
@property (weak) IBOutlet NSPopover *thePopover;
在您的实现文件中,显示popover:
[self.thePopover showRelativeToRect:[[self.theToolbarItem view] bounds] ofView:[self.theToolbarItem view] preferredEdge:NSMinYEdge];
这也适用于从工具栏项目中的菜单项选择中显示弹出窗口。
答案 3 :(得分:0)
虽然我确实使用Stuart Tevendale提到的方法显示了Popover,但当我尝试使用NSToolbarItems
验证(启用/禁用)NSToolbarDelegate
时,我确实遇到了问题:< / p>
-(BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem {
BOOL enable = YES;
NSString *identifier = [toolbarItem itemIdentifier];
// This does never get called because I am using a button inside a custom `NSToolbarItem`
if ([identifier isEqualToString:@"Popover"]) {
return [self someValidationMechanism];
}
// For this the validation works when I am using a standard `NSToolbarItem`
else if ([identifier isEqualToString:@"StandardToolbarItem"]){
return [self someOtherValidationMechanism];
}
return enable;
}
所以我建议不要从NSToolbarItem
显示一个Popover。另一种方法可能是显示页面表:How to show a NSPanel as a sheet