UITabBarController 和 UINavigationController 交互

Posted

技术标签:

【中文标题】UITabBarController 和 UINavigationController 交互【英文标题】:UITabBarController and UINavigationController Interaction 【发布时间】:2010-10-02 22:27:43 【问题描述】:

我有一个带有两个标签的标签栏的应用。一个选项卡显示 UINavigationController,另一个选项卡显示我自定义的 UIViewController。

我注意到的是,如果将选项卡切换到 UINavigationController 选项卡,然后在 UITableViews 中导航几个级别,如果我单击 UITabBar 上的 current 选项卡,UINavigationController 会弹出到它的根视图。

我想知道这是怎么发生的。 UINavigationController 似乎不是 UITabBar 或 UITabBarController 的委托,这本来是一种选择。该功能在某种程度上是自动的。

我想在第二个选项卡中的 UIView 上实现类似的操作,所以我想弄清楚这一点。谢谢!

【问题讨论】:

【参考方案1】:

UITabBarController 所做的是,每当您点击已选择的选项卡时,它都会检查该选项卡的UIViewController 是否为UINavigationController。如果是,则弹出到 rootViewController。

您要做的是将您的第二个标签设置为UITabBarController 的代表并检查

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

当该方法被触发时,检查viewController 是否是您的第二个选项卡视图控制器以及selectedIndexUITabBarController)是否为 1。如果是这种情况,请执行您的操作。

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

【讨论】:

谢谢,最理想的情况是我想要一个将来也可以在另一个选项卡上使用的解决方案 - 但我认为我只能将一个委托设置为 UITabBarController 您可以将委托设置为您的 appDelegate 对象。然后根据需要发送 NSNotification 或直接消息。【参考方案2】:

这实际上是一个很好的问题,直到今天我才注意到这种行为。 我对此有一个快速的猜测,经过一些测试,我似乎是正确的:因为您的 TabBarController 知道,它的选项卡包含一个 UINavigationController,它只是调用 NavigationController 的 popToRootViewControllerAnimated: 方法。我通过创建一个类别对此进行了测试,该类别覆盖了popToRootViewControllerAnimated: 方法(当然,您不应该在您的应用程序中这样做),瞧,这个方法实际上被调用了。 这回答了您关于“如何”的问题。如果有人能想办法在你的 ViewController 中重现这个,我会告诉你的。

【讨论】:

我已经尝试打印出所有通知和对 UIViewController 的 respondsToSelector 调用,并且在已选择选项卡后单击选项卡栏时没有调用任何内容。所以你是对的,它似乎确实是不同的行为,具体取决于它是否是 UINavigationController

以上是关于UITabBarController 和 UINavigationController 交互的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController和UITabBarController

UINavigationController  和 UITabBarController

UITabBarcontroller、UITableView 和 pushView

继承 UITabBarController 和 UINavigationController

UITabBarController的基本原理及使用

从 UITabBarController 和 UINavigationController 访问 UIViewController