WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [iPhone開発]KVCで値の変更を監視する

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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

某フライドチキンの話ではありません。CocoaにはKeyValueCoding(KVC)という機能がついていて、オブジェクトのプロパティを変更したり、その変更を監視する特別なメソッドが用意されてます。


#import

@interface HogeObject : NSObject {
@private
BOOL isChanged;
NSString *name;
}

-(id)init;
-(void)changeName: (NSString *) value;
-(NSString *)name;
-(BOOL) isChanged;
@end
+ (BOOL)automaticallyNotifiesObserversForKey:で監視するKey名を設定します。

#import "HogeObject.h"

@implementation HogeObject
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString*)key
{
if ([key isEqualToString:@"isChanged"])
{
return YES;
}

return [super automaticallyNotifiesObserversForKey:key];
}

-(id)init
{
if (self = [super init])
{
isChanged = NO;
name = @"hoge";
}

return self;
}

-(void)changeName: (NSString *) value
{
name = value;
[self setValue:[NSNumber numberWithBool:YES] forKey:@"isChanged"];
}

-(BOOL)isChanged
{
return isChanged;
}

-(NSString *)name
{
return name;
}

-(void)dealloc
{
[name release];
[super dealloc];
}
@end


HogeObject *test = [[HogeObject alloc] init];
//オブザーバーの登録
[test addObserver:self
forKeyPath:@"isChanged"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:nil
];
NSLog(@"%@:%@", [test name], [test isChanged] ? @"YES" : @"NO");

//変更してみる
[test changeName:@"oooo"];
NSLog(@"%@:%@", [test name], [test isChanged] ? @"YES" : @"NO");

//プライベートでも変更可能。changeNameの呼び出しではないのでオブザーバーは呼ばれない
[test setValue:@"mumu" forKey:@"name"];
NSLog(@"%@:%@", [test name], [test isChanged] ? @"YES" : @"NO");

//これは当然エラー
//test->name = @"gogogo";
ここではオブザーバーにselfを指定してるのでこのコードと同じクラスに以下のメソッドを実装します。これは必須です。

- (void)observeValueForKeyPath:(NSString*)keyPath
ofObject:(id)object
change:(NSDictionary*)change
context:(void*)context
{
NSLog(@"%@", change);
}
isChangedの値が変更されるとこのメソッドが呼ばれます。changeはどのように変更されたかの値がしまわれます。オブザーバー登録時にoptionsに渡したenumによってどんなデータが渡されるか設定できます。
スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。