ページ

2009年1月29日木曜日

キー監視(で失敗)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

プリファレンス設定を変更した時に SimpleViewerの表示へ即時反映したい。


NSUserDefaultsに対してキー監視を登録してやれば良い。

[[NSUserDefaults standardUserDefaults]
addObserver:self
forKeyPath:@"ViewerOptions.ImageBounds"
options:NSKeyValueObservingOptionNew
context:nil];


とすると、NSUserDefaultsの ViewerOptions_ImageBounds 値が変更されると下記がコールバックされる。
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context


だがアプリ起動時に下記エラーを出して強制終了してしまった。
[ addObserver: forKeyPath:@"ViewerOptions.ImageBounds" options:0x1 context:0x0] was sent to an object that is not KVC-compliant for the "ViewerOptions" property.


原因は Keypath文字列に . (ドット)が含まれていたこと。ドットは Keypathの区切りとして使われる特別な文字な為、別の解釈をされてしまった。 . をやめれば問題ない。

[[NSUserDefaults standardUserDefaults]
addObserver:self
forKeyPath:@"ViewerOptions_ImageBounds"  アンダースコア _ にしてみた。
options:NSKeyValueObservingOptionNew
context:nil];


- - - -
不注意にも NSUserDefaultsのキーのほとんどで . を使っていたので結局全部 _ に書き換えた。やれやれ。。