ぱっと見であまり考えなくてもなんとかなるかな?と思ったけど、やっぱり良くわからないな~。とりあえずメモしておこう。
テーブルの各カラム(NSTableColumn)の value は NSArrayController に controller key を arrangedObjects で bind する。で、Model Key Path は Key-Value coding で言う key。あ~後で読み返すと何言ってるんだかわからない…。controller key と Model Key Path の両方に key があるのがややこしい。 もう一回。「テーブルの各カラムの内容は、NSArrayController に arrangedObjects して NSArray をゲットし、それに valueForKey:key で key の NSArray を最終的に取り出したもの。」かな? こんな感じ…
value = [[nsArrayController arrangedObjects] valueForKey:key];
各カラムを NSArrayController に bind して NSArrayController にデータをセットすればテーブルは表示される。データのセットは NSArrayController に addObject で1つずつ加えるか、addObjects で NSArray を加えるかでできる。既に加えた object への挿入/消去は insert と remove がある。 で、加える objectってどんなん?ってのは NSDictionary(で良いのか?)。NSTableView のカラムの数だけ key の value があれば良い。 カラムが2つでそれぞれ "Filename", "Date"って key で bind されているなら、NSArrayController の中身である NSArray の object(行) になってる NSDictionary は key が "Filename" の value と "Date" の value がセットされてれば良い。
NSMutableDictionary *object = [NSMutableDictionary dictionary]; [object setValue:@"namae" forKey:@"Filename"]; [object setValue:@"04/25/07" forKey:@"Date"]; [nsArrayController addObject:object];
って感じ。行の数だけ object を加えれば OK。 NSArrayController の上に? NSObjectController があってそこに setContent と content があるけど、挿入された行を選択状態にする時のパフォーマンスを気にしなければ使わなくて良いのかな?
次に NSTableView で選択された行にあるデータの詳細を表示する部分(NSTextField)を作った場合。Master-detail インタフェースって Cocoa binding の説明で書かれてたやつ。これは NSTextField の binding を設定する。NSTextField の value は NSArrayController の selection に(Model Key Path の)Key で bind する。 さっきと同じように書くと「NSTextField の内容は、NSArrayController に selection して選択された行の object をゲットし、それに valueForKey:key で key の値を取り出したもの。」かな。selection は NSObjectController にあるのか…。 こんな感じ…
value = [[nsArrayController selection] valueForKey:key];
ってなわけで、NSArrayController がデータ持ってて、それから NSTableView や NSTextField が情報を取り出してる。で、NSTableView の選択されてる行が変わると、NSTextField の値は selection の key なので、選択されている行の値に変更されると。
それじゃ次は NSTableView でダブルクリックされたらその行の何かを表示したいとかって場合は? NSTableView の Bindings、Action Invocation に doubleClickTargetってのがあるので、これでターゲットを設定できる。さらに doubleClickArgumentってのもある。これで引数を設定できる。が、これはなんだか良くわかってない…。とりあえず設定の方法はココに書いてあるのでこれを真似したら動いた。 まずは doubleClickTarget の方。Bind to はターゲットになるオブジェクト。で、つぎの controller key は使わない。Model Key Path は self(ここが???)。で、下の方に行って Selector Name がターゲットになってるオブジェクトの Selector。ま、動作からして doubleClicked とか? 特に引数がいらなければこれで OK。
- (void)doubleClicked { }
でダブルクリックを拾える。 選択されているオブジェクトとかの引数が必要な場合、doubleClickArgument でどんな引数が必要かを設定する。選択されているオブジェクトの場合は Bind to は NSArrayController で、controller key は selectedObjects。Model Key Path はいらなくて、下の方の Selector Name がターゲットになってるオブジェクトの Selector。これは doubleClickTarget と同じ。で、こんな感じ。
- (void)doubleClicked:(NSArray*)selectedObjects { }
これで選択されている行のデータ付きでダブルクリックを拾える。doubleClickArgument を設定すると doubleClickArgument2 が自動的に出てくる。で、これも設定すると doubleClickArgument が…。ってな感じでたくさん引数を渡せるのだけど、NSArrayController なら選択されているオブジェクトで十分じゃないのかな?
というわけで、なんとなくできた部分はこんな感じなのだけど、binding でどうだかな~という部分もある。その辺はまた今度メモっておこう。
スポンサーサイト
テーマ:プログラミング - ジャンル:コンピュータ
|