我正在尝试制作状态栏项目,例如右上角的电池或时间机器指示器。我的代码在下面
- (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: 所有人都说它们同时可用并折旧,请看下图。还有其他方法,我可以做到这一点。我想要一个窗口/面板显示单击项目时,可能附加到栏。
答案 0 :(得分:2)
您正在将图像大小设置为无意义的值。 NSSquareStatusItemLength
是-2。这是一个哨兵值,而不是实际长度。
您需要使用systemBar.thickness
来确定用于方形状态项的实际大小。
关于弃用的方法,在10.10中,NSStatusItem
具有新的button
属性。应该使用它来代替现在已弃用的view
属性(您未使用它)。所有其他已弃用的属性现在只是覆盖调用按钮上相应方法的方法。使用这些封面方法是安全的,它们仍应有效。
您没有对状态项进行强有力的引用。它只存储在一个局部变量中。如果您正在使用ARC,则表示它是在-activateStatusBarItem:
方法结束时发布的,该方法会将其从状态栏中删除。所以,你正在创建它并快速连续删除它。您应该保留一个强引用,可能在实例变量中。 +[NSStatusBar statusItemWithLength:]
:
接收方不保留对状态项的引用,因此您需要保留它。否则,在取消分配对象时,该对象将从状态栏中删除。