在NSStatusItem上实现NSPopover

时间:2012-12-27 01:44:30

标签: objective-c cocoa nsstatusitem nspopover

我目前在NSStatusItem中初始化的状态栏有awakeFromNib,如下所示:

    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [statusItem setMenu:statusMenu];
    [statusItem setImage:statusImage];
    [statusItem setAlternateImage:statusHighlightedImage];
    [statusItem setHighlightMode:YES];
    [statusItem setTarget:self];

点击图标后会打开NSMenu。点击后,其中一个选项应该从状态栏图标打开NSPopover。为此,我有这个代码,它通过Interface Builder连接到菜单项:

- (IBAction)prefs:(id)sender {    
    NSRectEdge prefEdge = NSMaxYEdge;

    [[self pop] showRelativeToRect:[[statusItem view] bounds]
                          ofView:[statusItem view]
                   preferredEdge:prefEdge];
}

但是,当我单击应该打开Popover的菜单项时,没有任何反应。有什么特别的原因可能出现这种情况吗?据我所知,应该可以做到。

提前致谢。我尽可能地查看了Stack Overflow,但是如果有一个真正重复的问题,请链接到我。

仅供参考:statusItem变量是NSStatusItem

2 个答案:

答案 0 :(得分:2)

您需要使用[statusItem setView:][statusItem view]设置视图,以便返回非nil

如果您不介意使用私有API,可以尝试调用[statusItem _button],但如果您计划提交到App Store,则不允许这样做。

答案 1 :(得分:0)

我不知道这个问题是否已经解决,但我有一些笔记。

  1. 第一步是验证(发出 NSLog,或在调试器中的断点处停止)您的菜单项确实有效,并且正在调用 prefs: IBAction
  2. 我不知道你的 UI 设计,但显示相对于命令它出现的 NSMenuItem 的弹出窗口是有意义的,而不是相对于 NSStatusItem。因此,请使用 [(NSMenuItem *)sender view] 作为锚点及其边界。
  3. 尝试从应用中的其他位置显示弹出窗口 - 只是为了确保实际弹出窗口正常并且可以显示。