NSUserDefaultsControllerでbinding出来るデータ構造についてのメモ

NSUserDefaultsControllerとcocoa bindingを使い、初期設定WindowのUIを作ろうとして失敗した。 その失敗についての箇条書きのメモ

  • NSUserDefaultsが持っているデータ構造は、plist形式と考えて良い。
  • NSUserDefaultsがデータ構造に情報を溜め込むアクセッサ、setStringやsetIntgerなどは、keyを指定し、keyPathではない。
  • plistなデータ構造の深い位置にアクセスするにはkeyPathで指定できるべきである。
  • NSUserDefaultsで保持するデータは、keyで指定可能な位置の物は、mutableである。keyPathが必要な場所は、immutableになっているように見える。
  • ググると、mutableCopyした後に変更を加えて、setObjectしている事例がいくつかある。
  • NSUserDefaultsControllerは、深い階層へのPathのアクセスの不具合や、immutableなArrayやdictonaryの問題を解決するわけではない。
  • NSUserDefaultsControllerで使うPathは”values.key”のようにドットは1つまでにする必要がある。”value.key1.key2”のようにする、中間のimmutableなobjectがKVOに対応していないとログに警告とエラーが出る。
  • 泥臭い解決方法は、plist形式と言いつつ、最初の階層だけのフラットな構造にすると良い。”values.key1.key2”を”values.key1_key2”のようにする。
  • NSUserDefaultsControllerのselectedObjectにさらにNSArrayControllerを噛ませて、TableViewで表示する方法は、NSUserDefaultsControllerがNSArrayController側の変更を検知できないようだ。
  • おそらく、NSUserDefaultsControllerで取得した値をdeepMutableCopyして、ViewControllerに持たせ、そのデータが変わった時に、NSUserDefaultsControllerに反映させる方法が良いようだ。

もうやり気が出ない。