ページ

2008年2月12日火曜日

NSGradiationサンプルのフォロー

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

前回のサンプルのフォローを少し。

bindingを使い Angleの変更などを Viewへ反映している。



角度やグラデーション、色の数などの状態を MyControllerで保持し、これを Object Controllerを介して画面上のコントローラに紐づけている。グラデーションを描画する MyViewはこれらの状態をキー値監視(Key-Observing)の仕組みを利用して取得し、表示に反映させている。

Observerの登録は addObserver:forKeyPath:options:context:を使う。

MyView.m

-(void)awakeFromNib
{
[controller addObserver:self
forKeyPath:@"angle"
options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld)
context:nil];
[controller addObserver:self
forKeyPath:@"gtype"
options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld)
context:nil];
[controller addObserver:self
forKeyPath:@"cflag"
options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld)
context:nil];
}


監視対象の値が変化すると observeValueForKeyPath:ofObject:change:context: がコールバックされる。ここで再描画を指示する。
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
[self setNeedsDisplay:YES];
}


上記メソッドが呼ばれた時のデバッグ出力例 (1) Angleを変更:
2008-02-11 12:08:51.184 Gradient[4320:10b] change={
kind = 1;
new = 60;
old = 30;
}


デバッグ出力例 (2) タイプ(ラジオボタン)を変更:
2008-02-11 12:08:53.137 Gradient[4320:10b] change={
kind = 1;
new = 1;
old = 0;
}


デバッグ出力例 (3) 色数(チェックボックス)変更:
2008-02-11 12:08:47.092 Gradient[4320:10b] change={
kind = 1;
new = 1;
old = 0;
}



- - - -
bindingは本当に便利。