我有:
NSTableView读取NSUserDefaults数组:显示每个复选框,图像和文本条目的正确项目数和值。但是,单击复选框不会更改NSUserDefaults中保存的值,因此当我重新打开应用程序时整个表都会重置。
这个SO post引发了同样的问题,但他们在阵列控制器的绑定首选项中检查“处理内容为复合值”的解决方案对我来说不起作用。
我错过了什么?
答案 0 :(得分:-1)
以下是我的想法:
另一个答案有一个直接绑定到数组控制器的文本字段。在使用NSTableCellView
的基于视图的表格视图中,有一个额外的间接级别。
阵列控制器内容数组的元素被分配给表格单元格视图objectValue
。然后,您的复选框绑定到表格单元格视图的objectValue
属性。假设元素是NSMutableDictionary
个对象。因此,objectValue
是NSMutableDictionary
。切换复选框会更改字典中的一个值。但这与在表格单元格视图上调用-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"];
}