この通知は iOS5 から導入された新しいもので iOS4 に無いのが原因。この通知名は NSString* const で定義されている。
// UIWindow.h UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
そこでこの定数の有無をチェックしたい。調べると Appleがドキュメントを出していた。
SDK Compatibility Guide: Using SDK-Based Development
この中に通知に関する記述がある(以下、引用)。
Check the availability of an external (extern) constant or a notification
name by explicitly comparing its address—and not the symbol’s bare name—to NULL or nil.
なるほど通知名のアドレスが NULLかどうかをチェックすれば良いらしい。さっきのコードはこう書ける。
if (&UIKeyboardWillChangeFrameNotification != NULL) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
通知シンボルの前にアドレスを表す & を付けるのがポイント。これを忘れるとやっぱり EXC_BAD_ADDRESS でクラッシュ。
- - - - -
上述の Apple のリファレンスには他にも互換性を保つための実装情報が載っていて参考になる。
Responses
Leave a Response