NSMenuItem的状态绑定到NSUserDefaults中的布尔值不保持同步

ale*_*ntd 1 nsuserdefaults cocoa-bindings nsmenuitem

我的主菜单(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
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的app delegate +initialize方法中,我使用默认值填充标准用户默认值:

+ (void)initializeDefaults {
    NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:NO], @"wordWrapIsEnabled",
                             // etc.
                             nil];
    NSUserDefaultsController *ctrlr = [NSUserDefaultsController sharedUserDefaultsController];
    [ctrlr setInitialValues:defaults];
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我的NSMenuItem状态与我的用户默认值不同步.以下是发生的事情的时间表:

应用发布:

  • 未选中自动换行菜单项
  • wordWrapIsEnabled 没有
  • 自动换行是关闭的

第一次选择Word Wrap:

  • 选中Word Wrap菜单项
  • wordWrapIsEnabled不是(BZZZT WRONG)
  • 自动换行(BZZZT WRONG)

第二次选择Word Wrap:

  • 未选中自动换行菜单项
  • wordWrapIsEnabled(BZZZT WRONG)
  • 自动换行(BZZZT WRONG)

无限重复触发器.

我已经检查过以确保我的项目中没有其他内容可以访问wordWrapIsEnabled.在选择器的调用和wordWrapIsEnabled绑定的设置之间是否存在竞争条件?我一直在假设首先设置绑定值.

zou*_*oul 10

单击带有bound state(或value)属性的菜单项时,菜单项都会触发其操作翻转绑定值.并且似乎无法保证这两个操作的顺序,请参阅Cocoa Builder上的以下线程:

谢谢,我不是很确定,因为我在我的项目中做了一些更改,但我认为这可以被认为是10.5 sdk的错误,因为它开始发生在我开始编译它时.针对Tiger的(几乎)相同项目总是执行目标操作之前更改绑定值 ,无论它是按钮还是menuItem.显然,Leopard已经打破了这种一致性.我可能会在一些测试后发布错误报告来确认.

还有一个相关的雷达错误报告说菜单项不应该自动翻转绑定值.作为你的问题的答案,这可能为时已晚,但希望下次有人遇到这个问题时会有所帮助.