NSStatusItem不显示图像和标题

时间:2014-11-17 20:40:27

标签: xcode macos

我正在尝试制作状态栏项目,例如右上角的电池或时间机器指示器。我的代码在下面

- (void)activateStatusBarItem:(id)object{
NSStatusBar *systemBar = [NSStatusBar systemStatusBar];

NSStatusItem *theItem = [systemBar statusItemWithLength:NSVariableStatusItemLength];

NSImage *statusBarIcon = [NSImage imageNamed:@"icon-sleep.png"];
statusBarIcon.size = CGSizeMake(NSSquareStatusItemLength, NSSquareStatusItemLength);

[theItem setImage:statusBarIcon];
[theItem setTitle:@"abc"];
[theItem setTarget:self];
[theItem setAction:@selector(showHUD:)];
}

应用程序启动时会调用此方法。但是,我没有在菜单上看到项目。它确实工作过一次没有图像的相同代码。

当我研究Apple的那些方法时: - setTitle: - setImage: - setTarget: - setAction: 所有人都说它们同时可用并折旧,请看下图。还有其他方法,我可以做到这一点。我想要一个窗口/面板显示单击项目时,可能附加到栏。

enter image description here

1 个答案:

答案 0 :(得分:2)

您正在将图像大小设置为无意义的值。 NSSquareStatusItemLength是-2。这是一个哨兵值,而不是实际长度。

您需要使用systemBar.thickness来确定用于方形状态项的实际大小。

关于弃用的方法,在10.10中,NSStatusItem具有新的button属性。应该使用它来代替现在已弃用的view属性(您未使用它)。所有其他已弃用的属性现在只是覆盖调用按钮上相应方法的方法。使用这些封面方法是安全的,它们仍应有效。

您没有对状态项进行强有力的引用。它只存储在一个局部变量中。如果您正在使用ARC,则表示它是在-activateStatusBarItem:方法结束时发布的,该方法会将其从状态栏中删除。所以,你正在创建它并快速连续删除它。您应该保留一个强引用,可能在实例变量中。 +[NSStatusBar statusItemWithLength:]

记录了保持强引用的要求
  

接收方不保留对状态项的引用,因此您需要保留它。否则,在取消分配对象时,该对象将从状态栏中删除。