2011-05-31 52 views
5

当将NSArrayController的contentArray绑定到NSUserDefaultsController时,您必须检查绑定上的“处理内容作为复合值”复选框。这已经成为传统观点,但这个选择实际上做了什么?可可绑定的NSHandlesContentAsCompoundValueBindingOption做了什么?

我写了一个小测试应用程序,可以观察到打开了选项后,只要编辑数组中某个元素的属性,就会将整个contentArray传递给绑定源的setValue:forKey:。当选项关闭时,只有元素对象本身被修改,绑定源不会被通知。

这解释了为什么需要该选项才能使NSUserDefaultsController工作(否则它不会注意到您已经编辑了数组中的某些内容并从不保存更改)。但它并不能解释谁在做什么不同的事情。数组控制器是否负责此选项并在观察到更改时写回内容数组?如果是这样的话,它与选择的目的是“如何使用可逆值变换器将混合值暂时转换成小块”。

回答

1

消息流在这里解释相当不错:http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/MessageFlow.html#//apple_ref/doc/uid/TP40002149-186285

这里是我试图回答:

  1. 使用valueForKeyPath:contentObjectcontentArraycontentSet绑定从NSUserDefaultsController检索指定的原始内容对象
  2. 该内容对象使用值转换器的transformedValue:方法转换
  3. 来自用户的新的值被插入到转化的内容对象
  4. 内容对象使用inverseTransformedValue:
  5. 新,逆变换内容对象被设置为新的内容对象,并通过了NSUserDefaultsController使用setValue:forKeyPath:
  6. 至逆变换