UIKitはKVO(Key-Value Observing)に準拠していない
今作っているライブラリではViewControllerのViewのプロパティを格納するため、Windows Phone7(Silverlight)のViewModelと同様の責務を持つクラスを用意することを考えている。
ViewModelとViewのプロパティを同期させるために、.NET Frameworkではデータバインディングを使うが、UIKitでは同様の機能であるCocoa Bindingに対応していないため、KVO(Key-Value Observing)の機能を利用することを考えているのだが、例えば以下のようなUISwitchのonプロパティを監視するコードを書いても、オブザーバに変更の通知が渡ってこない。
SampleObserver.m
- (void)awakeFromNib { [switchComOnOff addObserver:self forKeyPath:@"on" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { NSLog(@"KeyPath= %@", keyPath); NSLog(@"ofObject= %@", object); NSLog(@"change= %@", change); }
変だと思いつつ、いろいろ調べていたのだが、どうやらUIKitのView群のプロパティは必ずしもKVOに準拠していないらしい。※
参考)
iphone - When does an associated object get released? - Stack Overflow
Cocoa BindingがCocoa Touch/UIKitをサポートしていないのは既知だったが、まさかそれよりもプリミティブなオブザーバパターンを構成するための仕組みであるKVO(Key-Value Observing)もサポートしていないとは。
KVOを利用することでUIKit上でもデータバインドを実装できると踏んでいたのだが、これはまいった。振り出しに戻ることにする。
※KVCには準拠しているものの、恐らくは内部処理でプロパティを経由せずにIvarを直接操作しているのだと思われる。