【问题标题】:TabBatController with viewControllersTabBatController 和 viewControllers
【发布时间】:2011-09-18 00:36:02
【问题描述】:

在我的基于 tabBarController 的应用程序中,我有四个选项卡 - tabA、tabB、tabC 和 tabD。用户将能够在选项卡之间跳转。

现在我的问题:
- tabA、tabB 和 tabD 有单个 viewControllers
- tabC 虽然有 3 个视图控制器 - vc1、vc2 和 vc3

我遇到了应用程序记住用户最后在哪个视图控制器中的问题,当用户点击 tabC 时,控件转到用户所在的最后一个视图控制器。例如,假设以下是顺序:

  1. 用户点击 tabA : 显示 tabA 的视图控制器
  2. 用户点击 tabD:显示 tabD 的视图控制器
  3. 用户点击 tabC:显示视图控制器 vc1。在点击某些操作时,用户会被带到 vc3
  4. 用户点击 tabB:显示 tabB 的视图控制器
  5. 用户点击 tabC:显示 vc3 - 而我想显示 vc1

到目前为止,我在tabC的vc1中尝试了以下,但是控件根本没有来到vc1:

- (void) viewWillAppear:(BOOL)animated {
      [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
}

如何告诉 tabC 总是加载 vc1?

问候 - 在此先感谢....
山姆。

【问题讨论】:

    标签: viewcontroller tabbarcontroller


    【解决方案1】:

    您对 tabC 的 vc1 的调用可能不会被调用 - viewWillAppear: 只有在视图出现在显示屏上时才会被调用。

    你可能想看看这个函数:

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

    (Link to Apple Developer docs)

    还有这个功能:

    - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated
    

    (Link to Apple Developer docs)

    如果你在你的tabBarController委托中实现这个,你可以在用户选择tabC时采取行动,即:

    - (void)tabBarController:(UITabBarController *)tabBarController 
       didSelectViewController:(UIViewController *)viewController
    {
        if (viewController == \* tabC view controller */) {
            [tabCViewController.navigationController popToRootViewController:YES];
        }
    }
    

    【讨论】:

    • 感谢您的回答。我没有这个建议。我将 AppDelegate 设为 TabBarControllerDelegate。回调函数被调用 - 但是,使用以下代码,我无法 popToRootViewController - 使用 if ([viewController.tabBarItem.title isEqualToString:@"vc1"]) { NSArray *tmp = [self.tabBarController.navigationController viewControllers] ; [self.tabBarController.navigationController popToRootViewController:YES]; tmp 数组显示零个 viewControllers!
    • 你在tab3中使用了导航控制器吗?如果是这样,现在您的代码正在获取tabBarController 的导航控制器。这不是您需要的 - tabBarController.navigationController 将位于视图层次结构中的 tabBarController 之上。试试[viewController.navigationController popToRootViewController:YES]; 而不是[self.tabBarController.navigationController popToRootViewController:YES];
    • 对不起,我很痛苦——但我仍然很沮丧。 popToRootViewController 似乎对我不起作用。我想知道的一件事是:tabC 是导航控制器。它知道它正在使用的三个 VC(即 vc1、vc2、vc3)。 AppDelegate 如何知道它 - 因为它是 TabBarControllerDelegate?
    • 每个视图控制器 vc1、vc2 和 vc3 都有一个 navigationController 属性。对于给定的UIViewController 实例,此属性设置为在其堆栈中具有此视图的导航控制器。所以,AppDelegate 得到了- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 调用,viewController.navigationController 应该在 tab3 中有导航控制器(因为 viewController 应该在那个导航控制器的堆栈上。)
    【解决方案2】:

    @dvorak:感谢您的回答 - 很抱歉拖了后腿......

    我知道我正在写的不是答案 - 但我想展示我正在使用的代码。

    我没有这个建议。我将 AppDelegate 设为 TabBarControllerDelegate。回调函数被调用 - 但是,使用以下代码,我无法 popToRootViewController:

    - (void)tabBarController:(UITabBarController *)tbController didSelectViewController:(UIViewController *)viewController {
           NSLog(@"ViewController is <%@>", viewController.tabBarItem.title);
           if ([viewController.tabBarItem.title isEqualToString:@"tabC"]) {
               NSArray *tmp = [viewController.navigationController.tabBarController viewControllers];
              [viewController.navigationController popToRootViewControllerAnimated:YES];
           }
    }
    

    我在tmp变量中收集了所有的ViewControllers,希望在访问tabC的所有三个VC之后看到数组中的3个ViewControllers。从 tabC->vc3,我点击 tabB,然后点击 tabC 进行练习。 tmp 数组在调试器中的元素为零。

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多