我有两个UI组件,其值通过用户默认值同步。第一个基本上是输入字段,另一个是菜单项。当输入字段的值更改时,菜单项的等效键更改为Cocoa绑定:
Input Field -> NSUserDefaultsController -> User Defaults
User Defaults -> NSUserDefaultsController -> Menu Item
这适用于除nil
值之外的所有内容。由于某种原因,我无法将实际nil
值存储在用户默认值中,而是使用空字典。在读取值的另一边,我有一个变换器,将空字典“膨胀”为nil
值。
现在,当我在输入字段中输入非零值时,它会进入用户默认值并正确传播到菜单项。当我输入“空”值时,空字典会正确存储在用户默认值中,但菜单项的绑定值不会更改。
我做错了什么?
答案 0 :(得分:0)
我做错了是将菜单项上的绑定实现为黑客。我通过类别引入了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
。