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
.
我有两个 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
.