导航控制器内的标签栏控制器,或共享导航根视图

我试图实现一个结构像Tweetie应用程序中的UI,其行为如下:顶层视图控制器似乎是一个导航控制器,其根视图是“Accounts”表视图。 如果您点击任何帐户,则会进入第二级,底部有一个标签栏。 每个选项卡项目显示不同的列表,并让您进一步向下钻取(后续级别不显示选项卡栏)。

所以,这似乎是实现层次结构是:

  • UINavigationController
    1. 帐户UITableViewController
    2. UITabBarController
      1. 推文UITableViewController
        • 推特/用户等的详细视图
      2. 回复UITableViewController

这似乎工作[^ 1],但似乎不支持根据SDK文档的-pushViewController:animated:强调增加):

viewController :被推入堆栈的视图控制器。 它不能是标签栏控制器的一个实例。

我想避免私人的API等,但我不知道为什么这个用法是明确禁止,即使它似乎工作正常。 任何人都知道原因?

我想过把标签栏控制器作为主控制器,每个选项卡包含单独的导航控制器。 问题是每个导航控制器需要共享一个根视图控制器(即Tweetie中的“Accounts”表) – 这似乎不起作用:将表控制器推到第二个导航控制器似乎将其删除从第一个。 更不用说在select不同的账户时所有的记账都可能是一个痛苦。

我应该如何实现这个正确的方法?

[^ 1]:标签栏控制器需要进行子类化,以使标签栏控制器在该级别的导航项目与选定标签的导航项目保持同步,并且单个标签的表格控制器需要将它们各自的详细视图self.tabBarController.navigationController推入self.tabBarController.navigationController self.navigationController而不是self.navigationController

前两个答案是正确的 – 我不使用Tweetie中的UITabBarController 。 编写一个自定义的XXTabBarControllerUIViewController普通子类)非常容易,它很高兴被推送到导航控制器堆栈,但仍然依靠“视图控制器”的理念。 帐户特定视图( Tweets / Replies / Messages )上的每个“标签”都是它自己的视图控制器,就他们而言,它们在屏幕上被一个普通的UITabBarController交换。

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

可以将UITabBar添加到任何UIViewController。 这样,你实际上不必推UITabBarController,因此保持在Apple API的指导范围内。

在界面生成器中,UITabBar位于Cocoa Touch Library的“Windows,Views&Bars”下。

我在几个应用程序中这样做。 将标签栏添加到基于navigationController的应用程序的技巧是不使用TabBarController。 向视图添加一个选项卡栏,使该视图的视图控制器成为TabBarDelegate,并响应视图控制器代码中选项卡栏上的用户select。

我使用Tab Bar将其他视图作为子视图添加到Tab Bar的视图中,使用不同的数据集重新加载表视图以重新加载UIPickerView等。

我在过去的一个小时里努力实现了一个UITabBar因为当我试图显示我的视图的时候它会隐藏起来; 然后我发现这个职位 :

基本上,确保你在tabbar下面插入你的新视图,按照下面这行代码:

 [self.view insertSubview:tab2ViewController.view belowSubview:myTabBar]; 

这是我做到的。 这实际上是将一个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]; } 

在我的应用程序中,根视图控制器是一个UINavigation控制器。 在应用程序的某个时候,我需要显示一个UITabBar。 我试图在导航层次结构中的UIView上实现一个UITabBar,因为一些以前的postbuild议,这确实有效。 但是,我发现我想要更多的Tab控制器提供的默认行为,我发现一种方法来使用UITabBarController与UINavigation控制器:

1)当我想显示UITabBarController的视图,我这样做:

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

2)当我想返回到我在导航层次结构中的位置时,我这样做:

 appDelegate.window.rootViewController = myNavControllerInstance; 

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

  1. 拖动一个ViewController
  2. 点击ViewController的场景
  3. 点击编辑>>embedded>>导航控制器。
  4. 在同一个ViewController上拖动一个button。
  5. 拖动一个TabBarController
  6. 通过推Segue行动将ViewController上的button连接到TabBarController。

在这种情况下,只有TabBarController的RootViewController将在导航控制器的堆栈中。 所有TabBarItems的顶部都有导航栏,用户可以随时进入主屏幕,而不pipe所选的TabBarItem

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

如果有效,请告诉我如何提高声誉,以便我可以在下一个答案中发布图像和代码。 🙂

我写了一篇关于如何处理这个问题的博文。 对我来说,使用模式视图比写一个自定义的标签栏实现更简单的解决scheme。

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