我的主菜单(MainMenu.xib)中有一个名为“Word Wrap”的 NSMenuItem。它的值绑定到我的共享用户默认控制器,也在 XIB 中实例化。选择时它还会发送以下操作:
- (IBAction)toggleWordWrap:(id)sender {
NSUserDefaultsController *ctrlr = [NSUserDefaultsController sharedUserDefaultsController];
if ([[[ctrlr values] valueForKey:@"wordWrapIsEnabled"] boolValue]) {
// turn on word wrap
} else {
// turn off word wrap
}
}
在我的应用程序委托的+initialize
方法中,我使用默认值填充标准用户默认值:
+ (void)initializeDefaults {
NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], @"wordWrapIsEnabled",
// etc.
nil];
NSUserDefaultsController *ctrlr = [NSUserDefaultsController sharedUserDefaultsController];
[ctrlr setInitialValues:defaults];
}
我的问题是我的 NSMenuItem 的状态与我的用户默认设置不同步。以下是发生的时间线:
应用启动:
- 未选中自动换行菜单项
wordWrapIsEnabled
没有- 自动换行已关闭
第一次选择自动换行:
- 选中自动换行菜单项
wordWrapIsEnabled
否(BZZZT 错误)- 自动换行已关闭(BZZZT 错误)
第二次选择自动换行:
- 未选中自动换行菜单项
wordWrapIsEnabled
是(BZZZT 错误)- 自动换行已打开(BZZZT 错误)
无限重复触发器。
我已经检查以确保我的项目中没有其他任何东西可以访问wordWrapIsEnabled
. wordWrapIsEnabled
在选择器的调用和通过绑定的设置之间是否存在竞争条件?我一直假设首先设置绑定值。