【问题标题】:Changes in NSTableView do not update NSUserDefaultsNSTableView 中的更改不会更新 NSUserDefaults
【发布时间】:2014-12-05 04:06:42
【问题描述】:

我有:

  1. 使用 NSTableCellViews 填充的 NSTableView
  2. 每个 NSTableCellView 都有一个复选框、图像和文本
  3. NSTableView 绑定到一个 NSArrayController
  4. NSArrayController 的内容数组绑定到 NSUserDefaults 中的字典数组

NSTableView 读取 NSUserDefaults 数组:为每个复选框、图像和文本条目显示正确的项目数和值。但是,单击复选框不会更改保存在 NSUserDefaults 中的值,因此当我重新打开我的应用程序时,整个表都会重置。

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

我错过了什么?

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    这是我认为正在发生的事情:

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

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

    认为在从复选框到NSTableCellViewobjectValue 的绑定上设置“将内容作为复合值处理”将强制它调用-setObjectValue:表格单元格视图,然后它将通过绑定将新值转发到数组控制器。这是在数组控制器绑定到用户默认控制器时设置“将内容作为复合值处理”的补充。

    我认为您将需要NSTableCellView 的自定义子类,并带有复选框的属性。将复选框绑定到此属性,而不是通过objectValue。 getter 将获得objectValue 的相关属性(对于本示例,我将使用allowed 属性)。 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"];
    }
    

    【讨论】:

    • 没有将复选框值绑定到 objectvalue.key 的“将内容作为复合值处理”设置。我相信只有绑定数组控制器的内容数组才能提供该选项。
    • 嗯。你是对的。我认为我对问题根源的分析仍然成立,但我更新了我的答案以提出不同的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多