首先,标签栏应该在根级别,即添加到窗口中,如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
只需第一次在选项卡/导航控制器上调用上述方法即可确保正确转发所有事件。它阻止了我需要从UINavigationBarDelegate
/UITabBarControllerDelegate
方法手动调用它们。
旁注:奇怪的是,当它不起作用时,私有方法
- (void)transitionFromViewController:(UIViewController*)aFromViewController toViewController:(UIViewController*)aToViewController
..您可以从工作实现的调用堆栈中看到,通常调用viewWill/Did..
方法,但直到我执行上述操作(即使它被调用)才调用。
我认为它UITabBarController
处于窗口级别非常重要,并且文件似乎支持这一点。
希望这很清楚(ish),很高兴回答进一步的问题。