nsuserdefaults - NSMenuItem 的状态绑定(bind)到 NSUserDefaults 中的 bool 值不保持同步

标签 nsuserdefaults cocoa-bindings nsmenuitem

我的主菜单 (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/

相关文章:

objective-c - NSPopUpButton + 绑定(bind) + 显示所有选项

cocoa - 绑定(bind):toObject:withKeyPath:options: is one-way binding?

xcode - IB 中的绑定(bind)和共享 NSUserDefaults 无法保存数据时出现问题

ios - 将收藏夹保存到 NSUserDefaults

iphone - 在Appstore中更新应用程序后,NSUserDefaults值和SQLite数据库

ios - 使用 NSUserDefaults 从 NSArray 中保存和检索 - Swift

objective-c - 在 NSMenuItem 中使用 NSProgressIndicator

iphone - 如何编辑 NSUserDefaults 中的存储值

cocoa - Finder Sync Extension 工具栏项目菜单的奇怪行为

cocoa - 在很多项目上使用 validateMenuItem