我想在我的工具栏中显示一个NSPopover
按钮NSToolbarItem
。
(即位于按钮下方)。
理想情况下,我想将NSView
按钮的 传递给弹出框以定位它。
我的问题是,我如何获得NSView
的NSToolbarItem
?
[toolbarbutton view]
总是返回零。
我想在我的工具栏中显示一个NSPopover
按钮NSToolbarItem
。
(即位于按钮下方)。
理想情况下,我想将NSView
按钮的 传递给弹出框以定位它。
我的问题是,我如何获得NSView
的NSToolbarItem
?
[toolbarbutton view]
总是返回零。
答案似乎在 2011 年 WWDC Session 113 的视频中,“全屏和 Aqua 变化”。基本上,在 NSToolbaritem 中放置一个 NSButton 并使用它的视图。
博客文章在这里:http://www.yellowfield.co.uk/blog/?p=33,示例项目在 github 上http://github.com/tevendale/ToolbarPopover
一切尽在http://xkcd.com/979!
您可以直接从NSButton
包含在NSToolbarItem
其中的操作发送操作(无论如何,您通常应该这样做,考虑分段控件,其中每个段都有自己的目标/操作),这样就可以了。
无需从 IBAction 发送方获取视图,而是将 IBOutlet 直接连接到工具栏项并使用它来获取相对视图:
在你的头文件中:
@property (weak) IBOutlet NSToolbarItem *theToolbarItem;
@property (weak) IBOutlet NSPopover *thePopover;
在您的实现文件中,显示弹出框:
[self.thePopover showRelativeToRect:[[self.theToolbarItem view] bounds] ofView:[self.theToolbarItem view] preferredEdge:NSMinYEdge];
这也适用于从工具栏项内的菜单项选择中显示弹出窗口。
虽然我确实使用 Stuart Tevendale 提到的方法显示了 Popover,但当我尝试使用以下方法验证(启用/禁用)时确实遇到了NSToolbarItems
问题NSToolbarDelegate
:
-(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
. 另一种方法可能是显示页面表:如何将 NSPanel 显示为工作表