2008年10月5日日曜日

Model-ViewだけでKVO(?)してくれるんだ.

なんか今まで誤解していたみたい.

ふつーにGUIのValueをModelオブジェクトの値に設定したらKVOもしてくれるのね.
例えばNSSliderのValueをモデルクラスとなるMyObjectのvalueという値につないだとする.



MyObjectはこんな感じにgetter/setterがあるとする.
- (double)value
{
return _value;
}
- (void)setValue:(double)value
{
_value= value;
NSLog(@"value= %f", _value);
}


そうするとスライダーを動かせばMyObjectのsetValueが呼ばれる.しかもvalueの戻り値が変わればSliderの表示も変わる

うーん.そんなだったっけ.

勝手にMVCにしなくてはいけないと思い込んでいたみたい.Model, View の他に NSObjectControllerのインスタンスでControllerを用意していないとModelの変化がViewに反映されないと思っていた.何かを試した際に間違ったことをして変に理解してしまったのだろう.

サンプル: これ
間違いがあればご指摘いただければ幸いです.


追記(2008/10/05):
getter/setter周りを"@synthesize"に任せるには(Objective-C 2.0(?)で記述するには)こんな感じ?
@interface MyObject : NSObject
{
double value;
}
@property double value;
@end

@implementation MyObject
@synthesize value;
@end

注意:プロパティの宣言と実装
重要: デフォルト値は@dynamicです。したがって、特定のプロパティに@synthesizeや@dynamicを指定しない場合は、そのプロパティのgetterメソッドとsetterメソッド(readonlyプロパティの場合はgetterのみ)の実装を用意する必要があります。

値をコードから設定するには以下になる.
- (void)method
{
self.value= 100;
}

追記(2008/10/05 2):
getter/setter周りを"KVCなGetter/Setter"に任せるにはこんな感じ?
@interface MyObject : NSObject
{
double _value;
}
@end

@implementation MyObject
@end
参考:Commonly Used Accessor Patterns

ただし,値をコードから設定するには以下になる.
- (void)method
{
[self setValue:[NSNumber numberWithDouble:100] forKeyPath:@"value"];
}
'_value'が最初からNSNumberだったら違和感がなかったかもね.

0 件のコメント: