久しぶりにObjective-Cをいじった。
マイコミの記事を参考にしていたんだけど、addObserverってのが出てきてハマった。。。
厳密には違うけど、ASで言うところのaddEventListener的な使い方ができる。
NSObjectで実装されているので、なんかしらのクラスを継承してれば使えるっぽい。
タイトルの「キー値監視」とは、あるオブジェクトのプロパティの値が変化した事を他のオブジェクトに通知すること。
addObserverはその変化の通知を受け取るオブザーバを登録する際に利用するメソッドのようだ。
キー値監視を行うには、
1、addObserverで監視対象のオブジェクト、監視したいプロパティ、監視するオブジェクトを監視されるオブジェクトに登録。
メソッドは以下。
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
・observer
イベントを受け取る人。通知を受け取るobserveValueForKeyPathというデリゲートメソッドを実装しておく必要がある。
・forKeyPath
いろんなところで「キー値」だとかいう説明がされてたけど、要はイベントを発行するオブジェクトのプロパティ名だと思う。「キー値」じゃなんだかわかんねーっつーのw
・options
変化する前の値を受け取るか、変化した後の値を受け取るか
・context
なんだかわからないっすw
2、オブザーバにてプロパティの変化を受け取るメソッドを定義
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object
change:(NSDictionary*)change context:(void*)context
3、setValueを使ってプロパティの値を変更する
これでできるはずなんだけど、どうやらデフォルトで自動通知がオフになっているらしいので、以下メソッドをオーバーライドしてYESを返す必要があるみたい。
特定のキー値の時YESを返すって感じです。
マイコミの記事を参考にしていたんだけど、addObserverってのが出てきてハマった。。。
厳密には違うけど、ASで言うところのaddEventListener的な使い方ができる。
NSObjectで実装されているので、なんかしらのクラスを継承してれば使えるっぽい。
タイトルの「キー値監視」とは、あるオブジェクトのプロパティの値が変化した事を他のオブジェクトに通知すること。
addObserverはその変化の通知を受け取るオブザーバを登録する際に利用するメソッドのようだ。
キー値監視を行うには、
1、addObserverで監視対象のオブジェクト、監視したいプロパティ、監視するオブジェクトを監視されるオブジェクトに登録。
メソッドは以下。
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context
・observer
イベントを受け取る人。通知を受け取るobserveValueForKeyPathというデリゲートメソッドを実装しておく必要がある。
・forKeyPath
いろんなところで「キー値」だとかいう説明がされてたけど、要はイベントを発行するオブジェクトのプロパティ名だと思う。「キー値」じゃなんだかわかんねーっつーのw
・options
変化する前の値を受け取るか、変化した後の値を受け取るか
・context
なんだかわからないっすw
2、オブザーバにてプロパティの変化を受け取るメソッドを定義
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object
change:(NSDictionary*)change context:(void*)context
3、setValueを使ってプロパティの値を変更する
これでできるはずなんだけど、どうやらデフォルトで自動通知がオフになっているらしいので、以下メソッドをオーバーライドしてYESを返す必要があるみたい。
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString*)key
{
if ([key isEqualToString:@"isFinished"])
{
return YES;
}
return [super automaticallyNotifiesObserversForKey:key];
}特定のキー値の時YESを返すって感じです。



