2011年4月29日金曜日

Cocoa Tabbed Interface NSViewControllerで作り直し(2) キー値監視

TabbedInterfaceを実現するために、現在作っているのは
・Tab・・tabそのものの描画とイベント処理をするクラス
・TabBar・・tabをsubViewとして管理するクラス、tabのoverflowなどの処理をする
・OverflowButton・・tabがoverflowした時に表示される>>みたいなボタン
・TabbarController・・以上のクラスのインスタンスを管理するクラス

以上4つ。このうちOverflowButtonを新しく作ったので、けっこう苦労している。TabとTabBarだけの時は実質ひとつのView(TabBar)でユーザー入力を処理していたので、コードがごちゃごちゃになった点を除けば[self 〜]でほとんどの処理ができたが、現在は複数のViewを同期させる必要ある。・・・といっても実質2つか(^^;)。

TabBar上でtabが描画しきれなくなったのでOverflowButtonを表示させたい、という場合、どうやってインスタンス同士が連携するのか本日勉強。

ま、一番わかりやすいのはNotificationですわな。その他、キー値監視という仕組みを使えばいいらしいことは知っていた。というわけでKVOを初めて使ってみた。苦労しましたわ、理解するまで。

TabBar上のstartIndexという数値が変化したら、その値を調べてOverflowButtonの動作を変更したい、というのがやりたい処理。どちらのクラスについても「知っている」必要があるので、結局TabbarController上で(Controllerなのでnib上のIBOutletでTabBar、OverflowButton両方をメンバとして持っているわけですな)
 [tabBar addObserver:self forKeyPath:@"startIndex" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)  context:NULL];
とした上で、
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    
    if([keyPath isEqualToString:@"startIndex"]){
     
        if (tabBar.startIndex>0) {
            leftOverFlowButton.buttonState=OV_NORMAL;
            
        }

とかなんとかやればいい、ということがわかった。しかしobserveValueForKeyPath:の引数を全然つかっていないので、Notification使ったほうがスマートな感じがするなあ。

[監視されるクラス addObserver:監視するクラス forKeyPath:監視されるクラスのメンバ]という関係がわかるまでけっこう時間がかかってしまった。さらに forKeyPathで指定されたメンバの変更は、[self set〜]形式で変更されたものでないと通知されない、と。やっぱNotificationのほうが便利なような気がする・・・(^^;)

自分のクラスのプロパティが、外部のクラスで変更された時に使うのが便利なのか。

というわけで、「OverflowButtonが押された時の処理」はNotificationでやってみることにする。これは明日。

0 件のコメント:

コメントを投稿