Во-первых, панель вкладок должна быть на корневом уровне, т.е. добавлена в окно, как указано в документации Apple. Это ключ к правильному поведению.
Во-вторых, вы можете использовать UITabBarDelegate
/ UINavigationBarDelegate
для пересылки уведомлений вручную, но я обнаружил, что для правильной работы всей иерархии вызовов представлений все, что мне нужно было сделать, это вручную позвоните
[tabBarController viewWillAppear:NO];
[tabBarController viewDidAppear:NO];
и
[navBarController viewWillAppear:NO];
[navBarController viewDidAppear:NO];
.. ТОЛЬКО ОДИН РАЗ перед установкой контроллеров представления на соответствующем контроллере (сразу после выделения). С тех пор он правильно вызывал эти методы на своих дочерних контроллерах представления.
Моя иерархия такая:
window
UITabBarController (subclass of)
UIViewController (subclass of) // <-- manually calls [navController viewWill/DidAppear
UINavigationController (subclass of)
UIViewController (subclass of) // <-- still receives viewWill/Did..etc all the way down from a tab switch at the top of the chain without needing to use ANY delegate methods
Простой вызов упомянутых методов на контроллере tab / nav в первый раз гарантировал, что ВСЕ события были перенаправлены правильно. Это остановило меня от необходимости вызывать их вручную из методов UINavigationBarDelegate
/ UITabBarControllerDelegate
.
Sidenote:
Любопытно, что когда это не сработало, приватный метод
- (void)transitionFromViewController:(UIViewController*)aFromViewController toViewController:(UIViewController*)aToViewController
.., который вы можете видеть из callstack на работающей реализации, обычно вызывает методы viewWill/Did..
, но не делал, пока я не выполнил вышеизложенное (даже если он был вызван).
Я думаю, что ОЧЕНЬ важно, что UITabBarController
находится на уровне окна, и документы, похоже, подтверждают это.
Надеюсь, что было ясно (иш), рад ответить на дополнительные вопросы.