我有一个作为普通应用程序运行的应用程序,但也有一个 NSStausItem
我想实现在首选项中设置一个复选框的能力,当这个复选框打开时,应该显示状态项,但是当复选框关闭时,状态项应该被删除或不可见。

我在这里的论坛中发现有人面临类似的问题:How do you toggle the status item in the menubar on and off using a checkbox?

但是我对这个解决方案的问题是它没有按预期工作。所以我设置了这个复选框并且一切正常,但是当我第二次打开应用程序时,应用程序无法识别我在第一次运行时所做的选择。这是因为复选框没有绑定(bind)到 BOOL 或其他东西,复选框只有一个 IBAction ,它在运行时删除或添加状态项。

所以我的问题是:如何在首选项中创建一个复选框,允许我选择是否应显示状态项。

好的,实际上我尝试了以下内容,我从给您链接的帖子中复制了

在 AppDelegate.h 中:

 NSStatusItem *item;
NSMenu *menu;
IBOutlet NSButton myStatusItemCheckbox;

然后在 Delegate.m 中:
- (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];
}

然后在 IBaction 我添加了这个:
[[NSUserDefaults standardUserDefaults] setInteger:[sender state]
                                               forKey:@"MyApp_ShouldShowStatusItem"];

在我的awakefromnib中,我添加了这个:`
NSInteger statusItemState = [[NSUserDefaults standardUserDefaults] integerForKey:@"MyApp_ShouldShowStatusItem"];
 [myStatusItemCheckbox setState:statusItemState];

然后在界面构建器中,我创建了一个新的复选框,将它与“myStatusItemCheckbox”连接起来,并添加了一个 IBaction 我还单击了绑定(bind)检查器并设置了以下绑定(bind)的值:NSUserDefaultController 和我设置的 ModelKeyPath:MyApp_ShouldShowStatusItem.不幸的是,这根本不起作用我做错了什么?

最佳答案

您需要做的是使用 User Defaults 系统。它使保存和加载首选项变得非常容易。

在按钮的操作中,您将保存其状态:

- (IBAction)toggleStatusItem:(id)sender {

    // Your existing code...

    // A button's state is actually an NSInteger, not a BOOL, but
    // you can save it that way if you prefer
    [[NSUserDefaults standardUserDefaults] setInteger:[sender state]
                                               forKey:@"MyApp_ShouldShowStatusItem"];
}

并且在您的应用程序委托(delegate)(或其他适当的对象) awakeFromNib 中,您将从用户默认值中读取该值:
 NSInteger statusItemState = [[NSUserDefaults standardUserDefaults] integerForKey:@"MyApp_ShouldShowStatusItem"];
 [myStatusItemCheckbox setState:statusItemState];

然后确保在必要时调用 removeStatusItem

此过程将适用于您可能想要保存的几乎所有首选项。

关于objective-c - 保存首选项以显示或隐藏 NSStatusItem,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5758778/

10-12 22:01