ナビゲーションコントローラ非表示時に画面をトップに戻すタイミング : Objective-C プログラミング
PROGRAM
ナビゲーションコントローラ非表示時に画面をトップに戻すタイミング
たとえば、UITabBarController で構成された画面で、表示される画面が UINavigationController で構成されたビューがあるとします。
このとき、UITabBarController のタブをタップして別のビューに移動した時に、それまで表示されていた UINavigationController で表示されている UIViewController の "viewWillDisappear:" メソッドは呼ばれるものの、"viewDidDisappear:" メソッドが呼び出されないことがありました。
この時の実装としては、途中で今のタブから離れて別のタブへ移動した後、ここに戻ってきたときに、そのタブのトップビューから操作を始められるように、 が非表示になる際に、表示されているビューをトップに戻すようにしていました。
UINavigationController を非表示にする際に、ビューをトップまで戻す場合に、直前まで表示されていた UIViewController の "viewDidDisappear:" メソッドが正しく呼び出されるようにするには次のようにします。
- (void)viewDidDisappear:(BOOL)animated
{
// 親の viewDidDisappear メソッドを呼び出します。
[super viewDidDisappear:animated];
// トップへ戻すのは、必ず、親の viewDidDisappear を呼び出した後にします。
[self popToRootViewControllerAnimated:NO];
}
ちなみに、"pushViewController:animated:" メソッドでビューを表示させた時には、次のような流れで、ビューが表示されて行くようでした。
- 表示中のビューの "viewWillDisappear:" メソッドが呼び出される。
- 次のビューの "viewWillAppear:" メソッドが呼び出される。
- 表示中のビューの "viewDidDisappear:" メソッドが呼び出される。
- 次のビューの "viewDidAppear:" メソッドが呼び出される。
そして、タブを移動して UINavigationController が非表示になる場合には、次のような流れになるようです。
- ナビゲーションコントローラーの "viewWillDisappear:" メソッドが呼び出される。
- 表示中のビューの "viewWillDisappear:" メソッドが呼び出される。
- ナビゲーションコントローラーの "viewDidDisappear:" メソッドが呼び出される。
- 表示中のビューの "viewDidDisppear:" メソッドが呼び出される。
今回のお話の症状は、このナビゲーションコントローラーの "viewDidDisappear:" メソッド内で、親の "viewDidDisappear:" メソッドを呼び出す前に "popToRootViewControllerAnimated:" メソッドを呼び出してしまったことが影響して、その後の、表示中のビューの "viewDidDisappear:" が呼び出されなくなってしまった感じでした。
[ もどる ]