ナビゲーションコントローラ非表示時に画面をトップに戻すタイミング : 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:" メソッドでビューを表示させた時には、次のような流れで、ビューが表示されて行くようでした。

  1. 表示中のビューの "viewWillDisappear:" メソッドが呼び出される。
  2. 次のビューの "viewWillAppear:" メソッドが呼び出される。
  3. 表示中のビューの "viewDidDisappear:" メソッドが呼び出される。
  4. 次のビューの "viewDidAppear:" メソッドが呼び出される。

そして、タブを移動して UINavigationController が非表示になる場合には、次のような流れになるようです。

  1. ナビゲーションコントローラーの "viewWillDisappear:" メソッドが呼び出される。
  2. 表示中のビューの "viewWillDisappear:" メソッドが呼び出される。
  3. ナビゲーションコントローラーの "viewDidDisappear:" メソッドが呼び出される。
  4. 表示中のビューの "viewDidDisppear:" メソッドが呼び出される。

今回のお話の症状は、このナビゲーションコントローラーの "viewDidDisappear:" メソッド内で、親の "viewDidDisappear:" メソッドを呼び出す前に "popToRootViewControllerAnimated:" メソッドを呼び出してしまったことが影響して、その後の、表示中のビューの "viewDidDisappear:" が呼び出されなくなってしまった感じでした。

[ もどる ]