Popover NSStatusItem

Con*_*cob 4 cocoa nsstatusitem nspopover

我正在玩一个想法,基本上我想要一个带有NSPopoverController的NSStatusItem.我读到了人们遇到的所有问题,但我只是想尝试一下.现在还有一个干净的方法吗?我见过的所有版本都至少有一年的版本和suuuuper hacky.

到目前为止这是我的方法,但如果我在状态栏中点击我的应用程序没有任何反应......

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];

    //[self.statusItem setView:view];
    [self.statusItem setTitle:@"Test"];
    [self.statusItem setHighlightMode:YES];
    [self.statusItem setAction:@selector(activatePopover:)];

}


-(IBAction)activatePopover:(id)sender
{
    BOOL isEnabled = NO;

    if (isEnabled) {
        [self.popover showRelativeToRect:NSMakeRect(0, 0, 50, 50) ofView:statusItem.view preferredEdge:NSMinYEdge];

    } else {
        [self.popover close];
    }
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何运行?

谢谢

tho*_*chs 7

如果不在状态项上使用自定义视图,则无法使用此功能.如果您没有设置自定义视图,则该view属性将为空(它仅返回自定义视图,而不是NSStatusItem您刚刚使用时在内部使用的任何视图setTitle).

不幸的是,根据Apple的文档,如果你想使用,你需要提供自己的视图并自己处理点击NSPopover.

我还没有看到一个包含正确处理的完整示例(状态项的默认实现相当多,您必须手动完成),并修复了popover wonkynesses:

  • NSPopover,默认情况下,不会成为关键窗口(某些控件不起作用),除非你覆盖canBecomeKeyWindowNSPopover的窗口
  • 正确解除其他状态项的菜单(您可以popUpStatusItemMenu使用空菜单调用以正确聚焦状态项)
  • 用中绘制突出显示的背景 drawStatusBarBackgroundInRect
  • 对左右鼠标点击做出反应
  • 使用NSRunningApplication.currentApplication.activateWithOptions,以确保您的状态项目的所有窗口变为有效(否则你的酥料饼会,不稳定,不能键盘输入的接收器)
  • 解雇NSPopover NSEvent.addGlobalMonitorForEventsMatchingMask(内置的解雇机制popovers随附状态项无效)
  • 使用终止时删除状态项 NSStatusBar.systemStatusBar.removeStatusItem

我希望很快就能有一篇关于这篇文章的博客文章(注意:我使用的是RubyMotion,而不是Objective-C),它解释了所有这些问题,并希望为创建menulet提供更简单的基础.如果我写这篇文章,我会更新这条评论.

  • 我的圣母!为什么Objective C和OS X开发很强大且难以理解? (3认同)
  • 调用[NSRunningApplication.currentApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps]; 在showRelativeToRect为我工作之后. (2认同)