基于导航的应用程序中的选项卡栏(再次)

时间:2009-10-05 18:01:02

标签: iphone cocoa-touch uiviewcontroller uitabbarcontroller tabbar

这是我的问题:

我已经阅读了很多关于如何在基于导航的应用程序中使用标签栏的内容,但我仍然无法弄明白。我试过使用并避免使用标签栏控制器,但我找不到解决方案。

我已经有一个基于导航的应用程序了。我有几个nib文件(视图),每个文件都有自己的视图控制器,我以编程方式推送到导航控制器堆栈。我需要其中一个视图才能有一个标签栏,允许我在其他一些标签栏之间切换。我理解标签栏的工作原理,我认为我需要的是使用标签栏控制器,因为它允许我定义与每个标签栏项关联的视图控制器,并管理所有关于它们的信息。但是,我看不出怎么做。

如果我在“tabBarViewController”中声明标签栏控制器,在我的“tabBarView”中绘制标签栏控制器并将它们与IB链接,它会给我一个错误(我认为这是因为我没有真的推动了标签栏控制器的视图吗?我需要的东西相当于“[window addSubView:[tabbarcontroller view]]?”。在这种情况下,我需要知道的是如何“看到”标签栏控制器的顶视图控制器的视图在我已经推动的视图控制器中。

如果我尝试不使用标签栏控制器,因为我已经阅读过这个问题的最佳解决方案,¿我如何管理标签栏项目,它们之间的切换等?

我真的很感谢你的帮助。

3 个答案:

答案 0 :(得分:0)

您无法将标签栏控制器推到导航控制器堆栈上。没有支持的方法。

您可能需要考虑的是创建自己的UITabBar实例,然后使用符合UITabBarDelegate的委托。这样,只要用户选择了标签栏项,您的代理就会收到tabBar:didSelectItem:消息。但是,您必须自己管理items的NSArray,而不使用IB。

一旦你弄明白了,剩下要做的就是将常规UIViewController推送到你的导航堆栈,就像让任何其他控制器管理你的标签栏和委托一样。

答案 1 :(得分:0)

我刚用TabBar控制器和5个navControllers制作了一个应用程序。您需要做的就是在tabBar控制器的第一个元素内加载nib和导航控制器。您可以隐藏tabBar,即使视图位于其中,并使其显示在您需要的视图中。

答案 2 :(得分:-1)

您可以使用一些代码执行此操作,如下所示:

FooViewController *foo = [[FooViewController alloc] init];
BarViewController *bar = [[BarViewController alloc] init];

UITabBarController *tabby = [[UITabBarController alloc] init];
[tabby setViewControllers:[NSArray arrayWithObjects:foo, bar, nil] animated:NO];
[self.navigationController pushViewController:tabby animated:YES];
[foo release];
[bar release];
[tabby release];

你也可以用IB做,只需从笔尖加载标签栏控制器。

我构建了一个示例项目来演示此操作,您可以从http://s3.thismoment.com/navtab.zip

下载它