我的代码分为两个主要实现: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];
}
}
感谢您的帮助!
答案 0 :(得分:3)
有几种方法可以实现这一目标。首先,您可以简单地将awakeFromNib实现移动到您可以访问出口的MenuController类中。 awakeFromNib不是特定于App Delegate,但可用于从Nib加载的所有对象(因为你在MenuController中有插件,我认为它是从Nib加载的。)
您还可以实现validateMenuItem :,始终返回YES,还可以设置作为参数提供给您的菜单项的状态。
或者,摆脱所有代码,只使用Interface Builder中的绑定。您可以将菜单项的“值”(==状态)绑定到“共享用户默认控制器”,并输入“LiveIcon”作为模型键路径。然后,您可以删除您发布的所有代码,它只会起作用。