Cocoa 绑定未从用户默认值中读取 nil 值

Cocoa bindings not reading a nil value from user defaults

我有两个 UI 组件,它们的值通过用户默认值同步。第一个本质上是一个输入字段,另一个是菜单项。当输入框的值改变时,通过Cocoa bindings:

相当于菜单项的key改变
Input Field -> NSUserDefaultsController -> User Defaults
User Defaults -> NSUserDefaultsController -> Menu Item

这对除 nil 值以外的所有内容都适用。出于某种原因,我无法在用户默认值中存储实际的 nil 值,我使用了一个空字典。在读取值的另一侧,我有一个转换器将空字典“膨胀”为 nil 值。

现在,当我在输入字段中输入非零值时,它会通过用户默认值并一直正确传播到菜单项。当我输入一个“空”值时,用户默认值中正确存储了一个空字典,但菜单项的绑定值没有改变。

我做错了什么?

我做错的是将菜单项上的绑定实现为 hack。我通过类别介绍了 keyCombo 属性:

@interface NSMenuItem (Combo)
@property(assign, nonatomic) MASShortcut *keyCombo;
@end

这是绑定到用户默认值的 属性。然后,由于我无法轻松地在类别中添加实例变量,我只是在 getter:

中返回 nil
@implementation NSMenuItem (Combo)

- (MASShortcut*) keyCombo
{
    return nil;
}

/* setter omitted */

@end

在我想通过绑定将 属性 设置为 nil 之前,这一直很有效。因为 getter 总是返回 nil,Cocoa 绑定机制认为没有必要更新 属性 值,因为它似乎已经是 nil .