以root身份使用UITabBarController初始化UINavigationController

时间:2015-12-13 22:52:45

标签: ios uinavigationcontroller uitabbarcontroller

我有一个根UINavigationController,并希望使用UITabBarController的实例初始化它,如下所示:

TabBarController * viewController = [[TabBarController alloc] init];
UINavigationController navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];

根据initWithRootViewController:方法的文档,这是个坏主意:

  

位于导航底部的视图控制器   堆。该对象不能是UITabBarController的实例   类。

所以我想知道:

  1. 为什么我们有这样的限制?
  2. ...为什么它有效并且不会抛出任何异常?这种方法有副作用吗?我尝试在我的标签栏控制器的所有选项卡中重复使用单个导航控制器,到目前为止,上面的代码运行良好。
  3. 我需要的是1)在我的所有标签中都有一致的NavBar(但是有不同的标题和左/右图标2)有些标签必须支持向下钻取导航3)我不需要标签切换到屏幕层次结构的更深层元素时的条形图面板。

    修改

    我刚刚意识到Skype for iOS是我想要实现的一个很好的例子:它在标签和导航方面与我的应用完全一样。

1 个答案:

答案 0 :(得分:2)

我想原因是如果你将另一个视图控制器推到导航堆栈上,它会将标签栏控制器推向标准动画的一边,从而导致用户体验混乱。

当您使用标签栏切换到不同的控制器时,您将在不同控制器之上推送下一个视图控制器,至少从用户的角度来看 - 这可能非常令人困惑。

标签栏实际上总是存在,所以将它嵌入另一个控制器控制器没有多大意义。如有必要,您可以隐藏特定屏幕的底栏。

最终它只是一个控制器控制器的事实也是它工作的原因。控制器的控制器无视其控制的控制器。

如果您描述了确切的用例,那么如果您的情况不是这样,那么您可以获得更具体的建议。也许您可能想考虑使用UIToolbar