4

我目前有一个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.

4

2 回答 2

2

您需要自己设置一个视图,使用[statusItem setView:]for[statusItem view]来返回非nil.

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

于 2012-12-27T02:29:49.400 回答
0

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

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