首先,标签栏应该在根目录级别,即添加到窗口中,如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
方法手动调用它们。
旁注:奇怪的是,当它不起作用时,私有方法
- (void)transitionFromViewController:(UIViewController*)aFromViewController toViewController:(UIViewController*)aToViewController
..在正常的实现中,您可以从调用堆栈中看到..通常会调用viewWill/Did..
方法,但是直到我执行了上述操作(即使它被调用)才开始调用。
我认为,非常重要的一点UITabBarController
是,它处于窗口级别,并且文档似乎对此进行了备份。
希望这很清楚,很高兴回答其他问题。