CocoaTouchなみなさんはKVCを知らない?
久しぶりにCocoaTouchなプログラムを書いてるんだが、NavigationBar関連で-viewWilldisappear:と-viewDidDisappear:が呼ばれないという問題に直面した。
まあ、CocoaTouchもだいぶ枯れてきてるので、だれかが解決してくれているだろうと思ってググってもUINavigationControllerDelegateは使わない、なんていう消極的な物か、自分でスタックしておく、という強引な物しか出てこなかった。
うなりながらUINavigationControllerのヘッダを見てると_disappearingViewControllerなんて言うそのままな名前のインスタンス変数があるじゃん!
なのにカテゴリで
-(UIViewController *)disapearingViewController { return _disappearingViewController; }
ってやってもリンク出来ない! @packageってなにw
で、3秒ほど考えて出た答え。
@interface UINavigationController(ONM_DissapearSupport) @property (readonly) UIViewController *disappearingViewController; @end @implementation UINavigationController(ONM_DissapearSupport) -(UIViewController *)disappearingViewController { return [self valueForKey:@"_disappearingViewController"]; } @end
Key Value Coding!!!
名前さえ分かれば@privateでもアクセスOK!!
で、UINavigationControllerDelegateはもちろんこう。
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [navigationController.disappearingViewController viewWillDisappear:animated]; [viewController viewWillAppear:animated]; } - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [navigationController.disappearingViewController viewDidDisappear:animated]; [viewController viewDidAppear:animated]; }
全然問題なく使えてます。