iOS 5 の ModalView での NavigationController の問題の原因と対策

ちょこっと調べると Apple Developer Forum でさっくり答えは出てきた。


iOS 5 だと [self.navigationController parentViewController] が nil になってるって。(ModalViewController の parentViewController が nil になる。)
デバッガで見てみると確かに 0x0 になってる。iOS 4.3.5 ではちゃんと MainViewController がゲットできるのに!

で、iOS 5 ではこんな場合 [self.navigationController presentingViewController] を使いなさいって事らしい。

- (IBAction)tapDoneButton:(id)sender {
	[[self.navigationController presentingViewController] dismissModalViewControllerAnimated:YES];
}

確かにデバッガで見るとちゃんと値は取れてる。


ところで presentingって何? それを用意したコントローラーって事?
この場合、NavigationController(ModalView のコントローラー)を用意したコントローラーだから、MainViewController。で、その MainViewController が presentModalViewController して ModalView を作ったので、やはり MainViewController が dismissModalViewControllerAnimated して ModalView を消すのが筋として正しい。


ま、わかれば簡単な話なんだけど、最初は何が起きたのかわからなかった…。
でも、これって iOS 5 以降に対応するアプリケーションは良いけど、iOS 4.3 以降対応とかのアプリケーションだと iOS 5 以降かどうかでコード変えなきゃいけないから面倒だね。フォーラムでもそんな話が。
自分はサックリ iOS 5 以降にしちゃうけど。


ところで、今回の例は MainView が親のビューだけど、自分のハマった件は TabBarController の中に MainView が入っていた。この場合、[self.navigationController presentingController] は TabBarController になってた。確かに TabBarController が用意しているビューが ModalView を作っているから、NavigationController(ModalView のコントローラー)から見た presentingController は TabBarController なんだろうけど…。なんか頭の中がややこしくなる!