我的主菜单 (MainMenu.xib) 中有一个名为“Word Wrap”的 NSMenuItem。它的值绑定(bind)到我的共享用户默认 Controller ,也在 XIB 中实例化。选中时它还会发送以下操作:
- (IBAction)toggleWordWrap:(id)sender {
NSUserDefaultsController *ctrlr = [NSUserDefaultsController sharedUserDefaultsController];
if ([[[ctrlr values] valueForKey:@"wordWrapIsEnabled"] boolValue]) {
// turn on word wrap
} else {
// turn off word wrap
}
}
在我的应用委托(delegate)的 +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
。在调用选择器和通过绑定(bind)设置 wordWrapIsEnabled
之间是否存在竞争条件?我一直假设首先设置绑定(bind)值。
最佳答案
当您单击具有绑定(bind) state
(或 value
)属性的菜单项时,菜单项既会触发其操作,又会翻转绑定(bind)值。而且这两个操作的顺序好像也不能保证,看下面thread on Cocoa Builder :
Thanks, I am not absolutely sure because I did several changes in my project but I think that this can be considered a bug of 10.5 sdk, because it started to happen when I started to compile for it. The (almost) same project when it was targeted for Tiger always changed the bound value before the target-action was executed, regardless if it was a button or a menuItem. Apparently this consistency has been broken in Leopard. I may post a bug report after some testing to confirm it.
还有一个相关的Radar bug report说菜单项不应该自动翻转绑定(bind)值。现在回答您的问题可能为时已晚,但希望下次有人遇到此问题时能有所帮助。
关于nsuserdefaults - NSMenuItem 的状态绑定(bind)到 NSUserDefaults 中的 bool 值不保持同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113918/