・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 件のコメント:
コメントを投稿