首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Popover NSStatusItem

Popover NSStatusItem
EN

Stack Overflow用户
提问于 2014-04-29 10:36:15
回答 2查看 3K关注 0票数 4

我在玩弄一个想法,基本上我想要一个带NSPopoverController的NSStatusItem。我读过人们遇到的所有问题,但我只想试一试。现在有没有一种干净利落的方法呢?我见过的所有版本都至少有一年的历史,而且都很新潮。

到目前为止,这是我的方法,但如果我在状态栏中单击我的应用程序,什么也不会发生……

代码语言:javascript
复制
- (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];
    }
}

有什么办法让它运行起来吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-05-04 20:31:24

如果不在状态项上使用自定义视图,这将不起作用。如果您不设置自定义视图,则view属性将为空(它只返回自定义视图,而不是您仅使用setTitleNSStatusItem在内部使用的任何视图)。

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

我还没有看到一个完整的例子来正确地处理这个问题(状态项的默认实现做了相当多的工作,您必须手动完成所有这些工作),并且还修复了popover wonkynesses:

默认情况下,

  • NSPopover,不会成为关键窗口(某些控件将不起作用),除非您覆盖NSPopover的window
  • Correctly取消其他状态项菜单的窗口(您可以使用空菜单调用popUpStatusItemMenu以正确聚焦您的状态,并使用drawStatusBarBackgroundInRect
  • Reacting to left和right鼠标单击
  • item)
  • Drawing NSRunningApplication.currentApplication.activateWithOptions以确保状态项的所有窗口都变为活动状态(否则,您的弹出窗口将不正常地,不是键盘和带NSStatusBar.systemStatusBar.removeStatusItem

的NSPopover的接收器(内置的解除机制弹出窗口不适用于status items)

  • Removing带NSStatusBar.systemStatusBar.removeStatusItem

的NSPopover on NSEvent.addGlobalMonitorForEventsMatchingMask

我希望在不久的将来有一篇关于这方面的博客文章(注意:我使用的是RubyMotion,而不是Objective-C),它解释了所有这些问题,并希望为创建menulets提供一个更容易的基础。如果我写了那篇文章,我会更新这条评论。

票数 7
EN

Stack Overflow用户

发布于 2015-10-31 23:23:15

代码:

代码语言:javascript
复制
-(void)initializeStatusBarItem
{
    self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
    NSImage* image = [NSImage imageNamed:@"image"];
//    [image setTemplate:YES];
    self.statusItem.button.image = image;
    self.statusItem.highlightMode = NO;
    self.statusItem.button.action = @selector(statusBarItemDidClick:);
}

- (void)statusBarItemDidClick:(NSStatusBarButton *)sender{
    MainViewController *mainView = [[MainViewController alloc] init];
    self.popoverView = [[NSPopover alloc] init];
    [self.popoverView setContentViewController:mainView];
    self.popoverView.contentSize = CGSizeMake(300, 400);
    self.popoverView.behavior = NSPopoverBehaviorTransient;
    [self.popoverView showRelativeToRect:sender.bounds ofView:sender preferredEdge:NSMaxYEdge];
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23354488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档