从NSToolbarItem按钮显示NSPopover

时间:2011-11-15 20:33:50

标签: cocoa nsview nstoolbaritem

我想在工具栏中的NSPopover按钮上显示NSToolbarItem (即位于按钮下方)。

理想情况下,我想将按钮的NSView传递给弹出窗口以定位它 我的问题是,如何获得NSView的{​​{1}}?

NSToolbarItem总是返回nil。

4 个答案:

答案 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