ふつーに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"に任せるにはこんな感じ?参考:Commonly Used Accessor Patterns@interface MyObject : NSObject
{
double _value;
}
@end
@implementation MyObject
@end
ただし,値をコードから設定するには以下になる.'_value'が最初からNSNumberだったら違和感がなかったかもね.- (void)method
{
[self setValue:[NSNumber numberWithDouble:100] forKeyPath:@"value"];
}
0 件のコメント:
コメントを投稿