2010-10-02 82 views
1

我有一个带有两个选项卡的选项卡栏的应用程序。一个选项卡显示一个UINavigationController,另一个选项卡显示我已经定制的UIViewController。UITabBarController和UINavigationController交互

我已经注意到的是,如果切换标签到UINavigationController的选项卡,然后导航深UITableViews几级,如果我点击UITabBar的当前选项卡中的UINavigationController弹出到它的根视图上。

我想知道这是如何发生的。它看起来并不是UINavigationController是UITabBar或UITabBarController的代理,这将是一个选项。该功能以某种方式自动进行。

我想在第二个选项卡上对我的UIView实施类似的操作,所以我想弄明白这一点。谢谢!

回答

2

UITabBarController正在做什么是,只要您点击一个已经选择的选项卡,它会检查该选项卡的UIViewController是否为UINavigationController。如果是,则弹出到rootViewController。

你想要做的是设置你第二个选项卡的UITabBarController的委托,并检查

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

当过该方法被触发,检查viewController是你的第二个选项卡的viewController,而且selectedIndex (的UITabBarController)为1.如果是这种情况,请执行您的操作。

这只适用于iOS 3.0或更高版本。在版本3.0之前的iOS版本中,只有在所选视图控制器实际发生更改时才调用此方法。

+0

谢谢,最好我想要一个解决方案,我可以在另一个选项卡上使用 - 但我想我可以只设置一个委托给UITabBarController – 2010-10-02 23:01:49

+0

您可以将委托设置为您的appDelegate对象。然后根据需要发送NSNotification或直接发送消息。 – gcamp 2010-10-03 14:13:36

1

这实际上是一个很好的问题,直到今天我从未注意到这种行为。 我对此进行了快速猜测,经过一些测试后,我似乎是正确的:由于TabBarController知道,它的选项卡包含UINavigationController,因此它只是简单调用NavigationController的popToRootViewControllerAnimated:方法。我通过创建一个类别来测试它,该类别覆盖了popToRootViewControllerAnimated:方法(当然,您不应该在您的应用中执行该方法),并且实际上调用了此方法。 这会回答你关于“如何”的问题。如果一个人可以考虑在你的ViewController中重现这一点,我会告诉你。

+0

我已经尝试打印出UIViewController的所有通知和respondsToSelector调用,并且在选项卡已被选中后单击TabBar时没有任何操作被调用。所以你是对的,它似乎是不同的行为取决于它是否是一个UINavigationController – 2010-10-02 23:31:16

相关问题