NSTextViewにCommand Paletteをつける
Cocoa勉強会2019/09/11の資料。
ソースコードだけ、資料は頭が回らない。あと、よく落ちるバグ付き。
CommandPalette.zip を解凍すること。
ソースコードの動作はムービーで動作確認したほうが早い( CommandPalette.mov )
エアコンはフィルターを掃除したら治った。
午前1時、室温は29度。エアコンの調子がおかしい。
すごく、恐怖を感じる。
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に反映させる方法が良いようだ。
もうやり気が出ない。