2007年7月21日土曜日

KVC : 既存のオブジェクトのテーブルをKVCで簡単に作れた.

0.目的:"テーブルの行に対応するオブジェクト"がある場合
     これらをテーブルに一覧表示したい.
  戦略:・"テーブルの行に対応するオブジェクト"をNSMutableArrayに詰め込んで
     NSArrayControllerとつないであげる.
     ・テーブルのカラムに表示する値は"テーブルの行に対応するオブジェクト"が
      有する"インスタンス変数"もしくは"値の取得メソッド"から得られるものとする.
     ・詰め込むNSMutableArrayはgetter,setterを用意するか,インスタンス変数名を用意します.

  gtter,setterについてはObjective-Cでよくあるのは(?)以下のようなモノです
   インスタンス変数として'_'から始まる値,
    例: _key
   このgetterとしてインスタンス変数から'_'のないもの
    例: key
   このsetterとしてインスタンス変数から'_'のないものにsetを付け足したもの
    例: setKey
   (あれ?大文字小文字はKVCとしてはどう扱っているんだろう?setKeyとsetkeyは同じ?)
  "Model Key Path"では上記例のkeyを指してあげます.
  これ以外でも良いようです(変数名はkeyでも良いようです).

1.テーブル,ArrayControllerを作る.
 InterfaceBuilderにてNSTableを配置, NSArrayControllerをInstanceの中に用意する.
 (このときNSArrayControllerにはわかりやすい名前を設定すると良い)

2.NSTableの設定
 Inspectorにて"bindings"を選び,"TableContent"の"content"を選ぶ.
 "Bind to"に1.で用意したNSArrayControllerを
 "Controller Key"に"arrangedObjects"とする.
 
3.各NSTableColumnを設定
 テーブルのカラムを何度かクリックしてInspectorのタイトルがNSTableColumnになるようにする.
 Inspectorにて"bindings"を選び,"Value"の"value"を選ぶ.
 "Bind to"に1.で用意したNSArrayControllerを
 "Controller Key"に"arrangedObjects"を
 "Model Key Path"にテーブル要素になるオブジェクトにある
 "値の取得,設定メソッド(getter,setter)"もしくは"インスタンス変数"を選ぶ.

4,NSArrayControllerの設定
 Inspectorにて"bindings"を選び,"Controller Content"の"contentArray"を選ぶ.
 "Bind to"に戦略に書いたNSMutableArrayが取得できるオブジェクト,
 "Controller Key"は空に
 "Model Key Path"にはNSMutableArrayのgetter,setterとなるキー値(もしくはインスタンス変数名)を設定する.

これで仕掛けはできました.が,NSMutableArrayにいくら詰め込んでも値が増えません.
(正確にはうまく更新されない.)
詰め込むためにはNSArrayControllerを取得してaddObject,addObjectsを利用するのが正しいようです.

…あってるかなー.なんか間違っているのかなぁ…
#ちなみにNSMutableArrayを保存すればSaveされるわけです.

…こうやって書くと全然,簡単でないな.

参考:
http://homepage.mac.com/t_yamane/prog/DocBaseTest2/page.html
ありがとうございます.

0 件のコメント: