我有两个 UI 组件,其值通过用户默认值同步。第一个本质上是输入字段,另一个是菜单项。当输入字段的值发生变化时,菜单项的等效键通过 Cocoa 绑定(bind)发生变化:
Input Field -> NSUserDefaultsController -> User Defaults
User Defaults -> NSUserDefaultsController -> Menu Item
这对于除 nil
值之外的所有内容都适用。由于某种原因,我无法在用户默认值中存储实际的 nil
值,而是使用空字典。在读取值的另一端,我有一个转换器,可以将空字典“膨胀”为 nil
值。
现在,当我在输入字段中输入非零值时,它会传递到用户默认值,并一直正确传播到菜单项。当我输入“空”值时,空字典会正确存储在用户默认值中,但菜单项的绑定(bind)值不会更改。
我做错了什么?
最佳答案
我做错的是将菜单项上的绑定(bind)实现为 hack。我通过类别引入了 keyCombo
属性:
@interface NSMenuItem (Combo)
@property(assign, nonatomic) MASShortcut *keyCombo;
@end
这是绑定(bind)到用户默认值的属性。然后,由于我无法轻松地在类别中添加实例变量,因此我只是在 getter 中返回 nil
:
@implementation NSMenuItem (Combo)
- (MASShortcut*) keyCombo
{
return nil;
}
/* setter omitted */
@end
这种方法运行良好,直到我想通过绑定(bind)将属性设置为nil
。因为 getter 总是返回 nil
,所以 Cocoa 绑定(bind)机制认为不需要更新属性值,因为它似乎已经是 nil
了。
关于objective-c - Cocoa 绑定(bind)不从用户默认值中读取 nil 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703665/