如何使用复选框打开和关闭菜单栏中的状态项?

时间:2009-05-09 14:02:51

标签: objective-c cocoa

我已经为菜单栏创建了一个状态项,但我想添加一个复选框,以便能够打开和关闭它。

因此,选中该复选框后,将显示状态项,如果未选中该复选框,则不会显示该状态项。

我需要使用哪些代码?

2 个答案:

答案 0 :(得分:8)

首先在您的控制器类中创建一个实例变量来保存对该项的引用:

NSStatusItem *item;

然后在选中该框时创建一个创建此状态项的方法:

- (BOOL)createStatusItem
{
NSStatusBar *bar = [NSStatusBar systemStatusBar];

//Replace NSVariableStatusItemLength with NSSquareStatusItemLength if you
//want the item to be square
item = [bar statusItemWithLength:NSVariableStatusItemLength];

if(!item)
  return NO;

//As noted in the docs, the item must be retained as the receiver does not 
//retain the item, so otherwise will be deallocated
[item retain];

//Set the properties of the item
[item setTitle:@"MenuItem"];
[item setHighlightMode:YES];

//If you want a menu to be shown when the user clicks on the item
[item setMenu:menu]; //Assuming 'menu' is a pointer to an NSMenu instance

return YES;
}

然后创建一个方法,以在取消选中项目时将其删除:

- (void)removeStatusItem
{
NSStatusBar *bar = [NSStatusBar systemStatusBar];
[bar removeStatusItem:item];
[item release];
}

现在通过创建一个在切换复选框时调用的操作将它们组合在一起:

- (IBAction)toggleStatusItem:(id)sender
{
BOOL checked = [sender state];

if(checked) {
  BOOL createItem = [self createStatusItem];
  if(!createItem) {
    //Throw an error
    [sender setState:NO];
  }
}
else
  [self removeStatusItem];
}

然后在IB中创建复选框并将操作设置为toggleStatusItem:方法;确保未选中该复选框。

编辑(以回应错误) 如上所述,您需要在已放置NSStatusItemcreateStatusItem方法的类的接口中声明removeStatusItem;这成为实例变量而不是createStatusItem方法的一个本地变量的原因是没有办法检索指向已经添加到Apple菜单中状态栏的项目的指针,并且按顺序要在取消选中该复选框后删除该项,您必须存储指向此项的指针。这也将解决您的第三个错误。

为了回应您的第二个错误,我只是在证明如果您想在单击状态项时向其添加菜单,则必须自己添加代码,检索指向NSMenu的指针;我正在展示你如何将这个菜单项添加到状态栏项,如果你的指针被调用menu,那么我的注释就在代码行旁边。

答案 1 :(得分:1)

获取要切换的按钮的插座,然后创建一个复选框指向的操作方法,根据复选框状态切换原始按钮的隐藏属性。