从AppController更改MenuController中的NSMenuItem状态?

时间:2011-01-13 04:24:55

标签: objective-c nsmenuitem setstate

我的代码分为两个主要实现:MenuController.m和AppController.m,每个都有头文件。

我有几个用户首选项,使用NSUserDefaults存储,并通过NSMenuItems更改,以便在启用时显示复选标记(使用 setState:NSOffState )。我的设置中只有一个缺失 - 如果选项在prefs中打开,我需要应用程序在启动时为那些菜单项 setState 。但是,我知道在app启动时设置内容的唯一方法是将它放在 awakeFromNib 方法中,并且在AppController中,并且无法访问实例化的 NSMenuItem MenuController。

我是Objective-C的新手,并且已经成功地获得了这一点,感谢本网站上的许多有用的教程和答案,但是现在我只是难倒了。

我尝试使用类和对象方法来更改设置,但是失败了 - 我需要使用现有的NSMenuItems实例。 validateMenuItem 看起来很有前途,但它只启用和禁用菜单,而不是setState。

相关代码(我认为):

来自MenuController.h的

@interface MenuController : NSMenu {
 IBOutlet NSMenu *optionsMenu;
 IBOutlet NSMenuItem *onTopItem;
 IBOutlet NSMenuItem *liveIconItem;
}

- (IBAction)menuLiveIconToggle:(id)pid;
来自MenuController.m的

:(更改prefs和setState的方法 - 效果很好)

- (IBAction)menuLiveIconToggle:(id)pid; {
 //NSLog(@"Live Icon Toggle");
 NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
 if ([standardUserDefaults boolForKey:@"LiveIcon"] == TRUE){
  [standardUserDefaults setBool:FALSE forKey:@"LiveIcon"];
  [liveIconItem setState: NSOffState];
 } else {
  [standardUserDefaults setBool:TRUE forKey:@"LiveIcon"];
  [liveIconItem setState: NSOnState];
 }
 [standardUserDefaults synchronize];
}
来自AppController.m的

:(不起作用,但这是它的要点)

- (void) awakeFromNib{
 // Update menu items
 if ([standardUserDefaults boolForKey:@"LiveIcon"] == TRUE) {
  [liveIconItem setState: NSOnState];
 } else {
  [liveIconItem setState: NSOffState];
 }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

有几种方法可以实现这一目标。首先,您可以简单地将awakeFromNib实现移动到您可以访问出口的MenuController类中。 awakeFromNib不是特定于App Delegate,但可用于从Nib加载的所有对象(因为你在MenuController中有插件,我认为它是从Nib加载的。)

您还可以实现validateMenuItem :,始终返回YES,还可以设置作为参数提供给您的菜单项的状态。

或者,摆脱所有代码,只使用Interface Builder中的绑定。您可以将菜单项的“值”(==状态)绑定到“共享用户默认控制器”,并输入“LiveIcon”作为模型键路径。然后,您可以删除您发布的所有代码,它只会起作用。