2007年7月21日土曜日

KVO : で,テーブルの行選択するたびに知りたい!のでKVO.

このエントリーにはまとめのエントリーが書かれました.新しいエントリーを参照してください.
NSArrayController(NSTableView)の選択結果の取得について
http://edotprintstacktrace.blogspot.com/2007/11/nsarraycontrollernstableview.html

ーー
さてココまで来て,テーブルを行選択する度に
イベントをおこして欲しい!となりました(私が).

KVOはあるオブジェクトのある"Model Key Path"でアクセスできる値を
観測していて変化があったときに登録したオブジェクトの
KVO用メソッドを呼んでくれるというものです(説明できてるかな…).

さて,具体的(?)に.
前述のNSArrayControllerを取得したとして,こいつの
selectionIndexesという値を以下のようにオブジェクト(ここではself)を登録する.

[_nsArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:NULL];


で登録されているモノが呼び出すのは以下のようなメソッド.

- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"selectionIndexes"]){
//event!
}
}


#注意:選択情報のもとはNSTableViewのselectionIndexesです.
#これをNSArrayControllerにbindすることで
#NSArrayControllerだけコード側でみれば良い状態にしていることを前提としてます.
#これをしない場合はNSTableViewをコード側で取得してこれにKVOをしてあげてください.

となる.うーんやっぱりNSArrayControllerを取得しないといけないのは正しいのかな?
でも要素の登録もController経由で行うというのは正しい姿だと思うから…あってる?.
そもそもNSArrayControllerにNSMutableArrayを設定するのが間違い?


追記(2008/10/06):GUIのKVO(?)について書いた

0 件のコメント: