2011年4月12日火曜日

Cocoa NSCollectionView(2)Cocoaバインディング

xcatsan師匠こちらの記事を読みながら、Cocoaバインディングをもう1回やってみる。ちなみにリンク先の記事は、あれこれ読んだ中で一番分かりやすく、一番実践的なCocoaバインディングの解説と思われる。

解説通りにやればもちろんうまくいく。それでは自分のコードではなぜうまくいかないか・・・。xcatsan師匠の解説では、ViewControllerのinit中でNSMutableArrayにデータを入れている。しかし自分のコードでは、NSOutlineViewで選択行が変更された時にデータを入れ替えている。

どうやら、ArrayControllerに、データソースであるNSMutableArrayのデータが変更されたよ、と教えるメソッドが必要らしい、とわかった。

ADCのサンプル、SourceViewのソースを追うと、なるほど、データが変更されたときはちゃんとupdateというメソッドを読んでいた。つまり、ArrayControllerに結び付けられたNSMutableArrayがlistと言う名前で、それが

@property (readwrite,assign)NSMutableArray* list;
とプロパティ宣言されているとしたら、
-(void)updateList:(id)obj{
    [self setList:obj];
}
というメソッドを記述しておかないとlistに対する変更がArrayControllerに伝わらない、と。

逆を言えば、updateを記述しておくだけであとはArrayControllerが面倒を見てくれるわけで、たしかに便利なしくみではある。わかるまでに時間がかかったけど。

で、こうなりましたよ。

うむー、NSCollectionView、アニメーションがなんかヤだなあ。(^^;)ひとつのアイコンにViewが2つも3つも使われているからけっこう処理が重そうだし。
NSCellを使った独自描画のViewを考えるべきかなあ。

その前にNSTableViewでバインディングとカスタム描画をやってみよう。これは明日以降。

0 件のコメント:

コメントを投稿