NSTableView中的更改不会更新NSUserDefaults

时间:2014-12-05 04:06:43

标签: objective-c cocoa

我有:

  1. 使用NSTableCellViews填充的NSTableView
  2. 每个NSTableCellView都有一个复选框,图像和文本
  3. NSTableView绑定到NSArrayController
  4. NSArrayController的内容数组绑定到NSUserDefaults中的字典数组
  5. NSTableView读取NSUserDefaults数组:显示每个复选框,图像和文本条目的正确项目数和值。但是,单击复选框不会更改NSUserDefaults中保存的值,因此当我重新打开应用程序时整个表都会重置。

    这个SO post引发了同样的问题,但他们在阵列控制器的绑定首选项中检查“处理内容为复合值”的解决方案对我来说不起作用。

    我错过了什么?

1 个答案:

答案 0 :(得分:-1)

以下是我的想法:

另一个答案有一个直接绑定到数组控制器的文本字段。在使用NSTableCellView的基于视图的表格视图中,有一个额外的间接级别。

阵列控制器内容数组的元素被分配给表格单元格视图objectValue。然后,您的复选框绑定到表格单元格视图的objectValue属性。假设元素是NSMutableDictionary个对象。因此,objectValueNSMutableDictionary。切换复选框会更改字典中的一个值。但这与在表格单元格视图上调用-setObjectValue:不同。因此,表格单元格视图的绑定没有理由通过绑定到数组控制器来转发新的对象值。

认为该设置"将内容处理为复合值"从复选框到NSTableCellView objectValue的绑定将强制它在表格单元格视图上调用-setObjectValue:,然后通过绑定将新值转发到阵列控制器。这将是设置"处理内容为复合值"在阵列控制器上绑定到用户默认控制器。

我认为您需要一个NSTableCellView的自定义子类,其复选框属性。将复选框绑定到此属性,而不是通过objectValue。 getter将获得allowed的相关属性(对于此示例,我将使用objectValue属性)。 setter实际上会修改复合对象,然后将其分配给objectValue属性以强制绑定将其写回数组控制器。所以,像:

@property (getter=isAllowed, nonatomic) BOOL allowed;

...

- (BOOL) isAllowed
{
    MyModelClass* model = self.objectValue;
    return model.allowed;
}

- (void) setAllowed:(BOOL)allowed
{
    MyModelClass* model = self.objectValue;
    model.allowed = allowed;
    self.objectValue = model;
}

// Make sure KVO and bindings know that when objectValue changes that means that allowed changes, too.
+ (NSSet*) keyPathsForValuesAffectingAllowed
{
    return [NSSet setWithObject:@"objectValue.allowed"];
}