代码之家  ›  专栏  ›  技术社区  ›  Daniel Dickison

导航控制器内的选项卡栏控制器,或共享导航根视图

  •  79
  • Daniel Dickison  · 技术社区  · 15 年前

    我正在尝试实现一个类似于 崔弟 应用程序的行为是这样的:顶层视图控制器似乎是一个导航控制器,其根视图是一个“帐户”表视图。如果您单击任何帐户,它将转到第二级,在底部有一个选项卡。每个选项卡项显示不同的列表,并允许您进一步深入(后续级别不显示选项卡栏)。

    因此,实现层次结构似乎是:

    • UINavigationController
      1. 账户 : UITableViewController
      2. UITabBarController
        1. 鸣叫 : 表格控制器
          • tweet/user/etc的详细视图
        2. 答复 : 表格控制器

    这似乎有效[^1],但根据的SDK文档,似乎不受支持 -pushViewController:animated: (增加了重点):

    可视控制器 :推到堆栈上的视图控制器。 它不能是选项卡栏控制器的实例。

    我想避免使用私有的API等,但我不知道为什么这种用法被明确禁止,即使它看起来工作正常。有人知道原因吗?

    我考虑过将选项卡栏控制器作为主控制器,其中每个选项卡都包含单独的导航控制器。问题在于,每个导航控制器需要共享一个根视图控制器(即中的“accounts”表 崔弟 )--这似乎不起作用:将表控制器推到第二个导航控制器上似乎会将其从第一个控制器中删除。更不用说在选择不同账户时所有的簿记可能会很痛苦。

    我应该如何以正确的方式实现这一点?

    [^1]:需要对选项卡栏控制器进行子类化,以便该级别的选项卡栏控制器的导航项与所选选项卡的导航项保持同步,并且单个选项卡的表控制器需要将其各自的详细视图推送到 self.tabBarController.navigationController 而不是 self.navigationController .

    9 回复  |  直到 8 年前
        1
  •  63
  •   Mutawe    11 年前

    之前的两个答案都是正确的-我不使用 UITabBarController 在Twite。写一个习惯很容易 XXTabBarController (普通子类 UIViewController )这很高兴被推到导航控制器堆栈上,但仍然遵循“视图控制器”的理念。帐户特定视图中的每个“选项卡”( Tweets / Replies / Messages )是它自己的视图控制器,就他们而言,他们在屏幕上被一个普通的ol交换。 Uitababarcontroller(Uitababarcontroller) .

        2
  •  34
  •   Robert Conn    12 年前

    我正在构建一个应用程序,它使用类似的导航框架来推特。我在博客上写了一篇关于如何做到这一点的文章 www.wiredbob.com 它还链接到源代码。它是一个完整的模板,可以作为另一个项目的基础。祝你好运!

        3
  •  10
  •   Himadri Choudhury    15 年前

    可以向任何uiviewcontroller添加uitabar。这样,您就不必推动uitababarcontroller,因此可以保持在AppleAPI的指导原则范围内。

    在Interface Builder中,Uitabbar位于Cocoa Touch库中的“窗口、视图和栏”下。

        4
  •  9
  •   Alpinista    15 年前

    我在几个应用程序中做这个。向基于导航控制器的应用程序添加选项卡栏的技巧是不要使用选项卡控制器。向视图中添加选项卡栏,使该视图的视图控制器成为选项卡栏,并响应视图控制器代码中选项卡栏上的用户选择。

    我使用选项卡栏将其他视图作为子视图添加到选项卡栏的视图中,使用不同的数据集重新加载表视图,重新加载uipickerview等。

        5
  •  6
  •   Mutawe    11 年前

    在过去的一个小时里,我一直在努力实现 UITabBar 因为当我试图显示我的视图时它会被隐藏;然后我发现了这个 post :

    基本上,请确保根据下面的代码行,将新视图插入到选项卡下面:

    [self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];
    
        6
  •  3
  •   richardsun    12 年前

    在我的应用程序中,根视图控制器是一个导航控制器。在应用程序的某个时刻,我需要显示一个UItaBar。我尝试在导航层次结构中的uiview上实现一个uitabar,正如前面的一些文章所建议的那样,这确实有效。但是我发现我想要更多的选项卡控制器提供的默认行为,我找到了一种将uitabarcontroller与uinavigation控制器一起使用的方法:

    1)当我想显示uitababarcontroller的视图时,我会这样做:

    MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    appDelegate.window.rootViewController = myUiTabBarControllerInstance;
    

    2)当我想返回到导航层次结构中的位置时,我会执行以下操作:

    appDelegate.window.rootViewController = myNavControllerInstance;
    
        7
  •  3
  •   Meet Doshi SanitLee    8 年前

    我就是这样做的。这实际上是将TabbarController推到导航控制器上。它很好用。我在文档中找不到苹果不支持这种方式的地方。有人能给我这个警告的链接吗?

    如果这是事实,苹果是否有可能拒绝将我的应用程序发布到AppStore?

    -(void)setArrayAndPushNextController
    {
        MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init];
        MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init];
    
        myFirstViewController.array = self.array;
    
    
        NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil];
        UITabBarController *tab = [[UITabBarController alloc] init];
        tab.viewControllers = array;
    
        [array release];
    
        UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1];
        UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2];
    
        myFirstViewController.tabBarItem = item1;
        mySecondViewController.tabBarItem = item2;
    
        [self stopAnimatingSpinner];
    
        [self.navigationController pushViewController:tab animated:YES];
    
        [tab release];
        [item1 release];
        [item2 release];
    }
    
        8
  •  2
  •   caffieneToCode    10 年前

    这可以通过简单地将Tabbar控制器嵌入导航控制器来实现。 在故事板中:

    1. 拖动视图控制器
    2. 点击视图控制器的场景
    3. 单击“编辑器”>>“嵌入导航控制器”。
    4. 在同一个视图控制器上拖动按钮。
    5. 拖动TabbarController
    6. 通过按Segue操作将ViewController上的按钮连接到TabbarController。

    在这种情况下,只有TabbarController的rootViewController在导航控制器的堆栈中。所有Tabbaritems的顶部都将有导航栏,用户可以随时进入主屏幕,而不必考虑所选的Tabbaritem。

    这可以在导航控制器堆栈中的任何视图控制器上完成。

    如果可行,请建议我如何提高声誉,以便我可以在下一个答案中发布图像和代码。:)

        9
  •  1
  •   dst    12 年前

    我写了一篇关于我如何处理这个问题的博客。对我来说,使用模式视图比编写自定义选项卡栏实现更简单。

    http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller/