【问题标题】:Toggle NSStatusItem with NSMenu in Objective-C在 Objective-C 中使用 NSMenu 切换 NSStatusItem
【发布时间】:2012-12-17 00:51:42
【问题描述】:

我有一个从首选项窗口切换 NSStatusItem 的应用程序。首选项窗口有一个“启用/禁用”复选框,它调用 NSStatusItem 类中的“enabledStatusItem”和“disableStatusItem”方法。

这一切都很好,我的问题是向这个 NSStatusItem 添加一个菜单。 NSStatusItem 类中的代码如下所示:

-(void)enableStatusItem
{
    //get icon
    theIcon = [NSImage imageNamed:@"test.png"];

    //create item
    statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [statusItem setImage:theIcon];
    [statusItem setHighlightMode:YES];
    [statusItem setMenu:statusMenu];
}

-(void)disableStatusItem
{
    [[NSStatusBar systemStatusBar] removeStatusItem:statusItem];
}

一切正常,除了 setMenu。起初我在 awakeFromNib 中加载了 StatusItem,然后 setMenu 起作用了。但是当首选项复选框“关闭”时,StatusItem 必须保持关闭,因此我无法再将其加载到 awakeFromNib 中。

我怀疑 setMenu 没有加载,因为它不在 awakeFromNib 中,但是在 awakeFromNib 之后调用了“enableStatusItem”,因此在 awakeFromNib 中还没有要添加菜单的 statusItem。而且我无法“预加载” statusItem,因为它是使用“[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];”创建的

到目前为止,我已经尝试了很多,甚至制作了一个测试应用程序,我在其中逐个添加了每段代码,以便我可以分解它。但到目前为止没有任何成功。

我觉得是因为这么简单的东西,只有一个小NSMenu,那难道没有简单的解决方案吗?

也许你们中的一个人有一个想法?

提前感谢您的宝贵时间, 问候弗兰斯

【问题讨论】:

  • 如果你把 setMenu: 放在 awakeFromNib 中而不是其他任何东西,它会起作用吗?
  • 正确,当我将 enableStatusItem 更改为 awakeFromNib 时,代码有效(显示菜单)。但这样我就无法打开和关闭 statusItem

标签: objective-c macos cocoa


【解决方案1】:

代码没问题,你有菜单没有保留的问题

assert(statusMenu);

【讨论】:

  • 嗨 Daij-Djan,我已经提出了 assert(statusMenu);在 setMenu-line 之后,但它不起作用,它给出了一个错误。我使用 ARC,所以也许这就是问题所在?
  • 能不能也显示带有statusItem和statusMenu声明的头文件?
  • { IBOutlet NSMenu* statusMenu; NSImage* theIcon; NSStatusItem* 状态项; } -(void)enableStatusItem; -(void)disableStatusItem;
  • 显然我谷歌搜索的力度不够,我找到了答案:stackoverflow.com/questions/8557129/…。我为菜单创建了一个新的 nib 文件,在此之前,所有内容都在应用程序拥有的 mainmenu nib 文件中。我将新笔尖的文件所有者更改为状态项类。我在 init 中调用了那个 nib 文件,现在它可以工作了!谢谢你们的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
相关资源
最近更新 更多