頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


BOOL値のプロパティ変化が常に真になる?

あるオブジェクトのプロパティを監視して値が変わったら通知、、、というとkey value observing(KVO)ってあれをやろうとしたえらくハマったのよ。
と言っても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にしてたよなあ、、、
と思うと簡単なんだけどね。

無駄に時間を食ってしまったというお話でした。

<< ヨーグルト生産第4弾、LG21の結果  TopPage  休暇村 紀州加太のキャンプ場に行ってきた >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1035-9a649df4




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.