今作っているライブラリでは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を直接操作しているのだと思われる。