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

时间:2015-06-08 07:45:19

标签: objective-c macos cocoa cocoa-bindings

我有两个UI组件,其值通过用户默认值同步。第一个基本上是输入字段,另一个是菜单项。当输入字段的值更改时,菜单项的等效键更改为Cocoa绑定:

Input Field -> NSUserDefaultsController -> User Defaults
User Defaults -> NSUserDefaultsController -> Menu Item

这适用于除nil值之外的所有内容。由于某种原因,我无法将实际nil值存储在用户默认值中,而是使用空字典。在读取值的另一边,我有一个变换器,将空字典“膨胀”为nil值。

现在,当我在输入字段中输入非零值时,它会进入用户默认值并正确传播到菜单项。当我输入“空”值时,空字典会正确存储在用户默认值中,但菜单项的绑定值不会更改。

我做错了什么?

1 个答案:

答案 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