11

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

理想情况下,我想将NSView按钮的 传递给弹出框以定位它。
我的问题是,我如何获得NSViewNSToolbarItem

[toolbarbutton view]总是返回零。

4

4 回答 4

9

答案似乎在 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

于 2011-11-19T19:20:13.317 回答
2

您可以直接从NSButton包含在NSToolbarItem其中的操作发送操作(无论如何,您通常应该这样做,考虑分段控件,其中每个段都有自己的目标/操作),这样就可以了。

于 2012-02-24T16:57:28.487 回答
2

无需从 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];

这也适用于从工具栏项内的菜单项选择中显示弹出窗口。

于 2013-01-21T06:41:43.223 回答
0

虽然我确实使用 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 显示为工作表

于 2014-03-27T15:17:56.513 回答