2011-05-31 51 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. 至逆變換