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];
}

全然問題なく使えてます。