BOOL値のプロパティ変化が常に真になる?
あるオブジェクトのプロパティを監視して値が変わったら通知、、、というとkey value observing(KVO)ってあれをやろうとしたえらくハマったのよ。
と言ってもiOS 10でもSwiftでもなく何も新しいことでハマったわけでもないんだけどね。
iPhoneのカメラをいじるのにAVCaptureDeviceクラスのadjustingFocusってプロパティを監視しようとしたんだわ。
[Objective-C] KeyValueObserve(キー値監視)メモ - Qiita
↑KVOはこのあたりの記事を参考にさせていただきました。
通知を受け取る方は↓こんな感じ。
changeってNSDictionaryオブジェクトに入ってるらしいから見てみた。
kind,1
new,0
とか
kind,1
new,1
とか確かに値を受け取ってるのよ。なるほど、keyが”new”で変化後のBOOL値が取得できるんだな。
”new”ってのを示してるのはNSKeyValueChangeNewKeyみたい。
どういうわけかBOOL値が真(true)しか示さないのよ。
ここにたどり着くにもたどり着いてからも時間食っちゃったけど、、、どこがまずいかわかる?
正解はこれ。
NSDictionaryに数値やBOOL値はそのままでは入らないからNSNumberにしてたよなあ、、、
と思うと簡単なんだけどね。
無駄に時間を食ってしまったというお話でした。
と言ってもiOS 10でもSwiftでもなく何も新しいことでハマったわけでもないんだけどね。
iPhoneのカメラをいじるのにAVCaptureDeviceクラスのadjustingFocusってプロパティを監視しようとしたんだわ。
[Objective-C] KeyValueObserve(キー値監視)メモ - Qiita
↑KVOはこのあたりの記事を参考にさせていただきました。
[captureDevice addObserver:self forKeyPath:@“adjustingFocus” options:NSKeyValueObservingOptionNew context:nil];ってな感じで登録。
通知を受け取る方は↓こんな感じ。
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)contextこのメソッド内でさっきのプロパティの変化後のBOOL値を得られるはず。
changeってNSDictionaryオブジェクトに入ってるらしいから見てみた。
{ for (id key in change) { NSLog(@"%@,%@", key,[change objectForKey:key]); } }すると、
kind,1
new,0
とか
kind,1
new,1
とか確かに値を受け取ってるのよ。なるほど、keyが”new”で変化後のBOOL値が取得できるんだな。
”new”ってのを示してるのはNSKeyValueChangeNewKeyみたい。
NSLog(@“new adjustingFocus %@“,[change objectForKey:NSKeyValueChangeNewKey]);↑これでも1 や 0で意図通りに変化してるのがわかった。よしよしと思ってコードを書いていったんだけど、、、
どういうわけかBOOL値が真(true)しか示さないのよ。
BOOL adjustingFocus = [change objectForKey:NSKeyValueChangeNewKey];とすると常に真になっちゃうのよ。
ここにたどり着くにもたどり着いてからも時間食っちゃったけど、、、どこがまずいかわかる?
BOOL adjustingFocus = (BOOL)[change objectForKey:NSKeyValueChangeNewKey];↑苦しまぎれにキャストしてもダメ。
正解はこれ。
BOOL adjustingFocus = [[change objectForKey:NSKeyValueChangeNewKey] boolValue];あああ、NSNumberか、そうだよな。
NSDictionaryに数値やBOOL値はそのままでは入らないからNSNumberにしてたよなあ、、、
と思うと簡単なんだけどね。
無駄に時間を食ってしまったというお話でした。
スポンサーサイト