如何将标签栏控制器放在视图控制器而不是委托中?

Posted

技术标签:

【中文标题】如何将标签栏控制器放在视图控制器而不是委托中?【英文标题】:How to put tab bar controllers inside of view controllers and not the delegate? 【发布时间】:2011-03-09 18:06:32 【问题描述】:

我有一个非常基本的 iphone 应用程序,其中执行以下步骤。

    加载的应用程序委托... 游戏根视图控制器(这只有 2 个按钮,“开始游戏”和“继续游戏”) 当点击开始游戏按钮时加载 RootViewController。 带有标签栏控制器的根视图控制器??

我真的不确定游戏如何在 iPhone 应用程序中做到这一点,但以上是我的最佳猜测。

我希望标签栏控制器只出现在 RootViewController 中,但无论我做什么,我都无法让标签栏控制器出现在这个视图中。

不过,我可以让正常的标签栏出现。但这不是标签栏控制器,我需要控制每个标签的功能(导航控制器、表格控制器等)。

根据docs,使用标签栏控制器的众多方法之一是通过应用程序的主窗口。但它并没有说您是否可以在正常视图中使用它;或者实际上如何。

我尝试了几次尝试使标签栏控制器看起来无济于事。

例如,在我的 GameRootViewController 里面的按钮如果我这样做;

-(IBAction) btnPress 

    RootViewController *root = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];

    [self.view addSubview:root.tabBarController.view];

    [root release];

什么都没有出现。

如果我尝试正常的做法:

[self.view addSubview:root.view];

视图出现了,但我从来没有看到标签栏控制器。

这让我很困惑。

我认为游戏/应用程序可能会这样做:

    应用代理 加载所有由...等制作的启动画面、制作人员名单 加载开始游戏,继续游戏画面并处理这些创建的动作 使应用程序委托窗口将标签栏控制器添加到 self.window。

但我不确定。我想澄清/了解我是否可以将标签栏控制器放在视图控制器中,或者它们只能在应用程序委托中使用?

【问题讨论】:

【参考方案1】:

首先,不要将控制器与视图混淆。视图是 UI 的可见部分,控制器是幕后的不可见对象。您不要将控制器放在视图中或将控制器“放在”其他控制器中。相反,控制器存在于各种层次结构中,这些层次结构的结构决定了哪些视图出现在何时何地。

您以非标准方式使用标签栏(这可能会使用户感到困惑),但您需要将标签栏控制器放在导航控制器内,以便获得如下所示的层次结构:

navigationController (rootViewController)
    -->TabBarController(secondController)
        -->tabViewController1
        -->tabViewController2
        -->tabViewController3

所以,你的第一个可见视图是由 navigationController 的 rootController 控制的按钮视图。选择一个按钮后,它会将 TabViewController 推送到导航堆栈上,从而使选项卡栏进入视图,并选择默认选项卡。 (请注意,您必须隐藏导航栏以使导航堆栈对用户不可见。)

【讨论】:

我想我明白了。但这不是意味着应用程序委托使用了加载 rootViewController 的导航控制器吗?或者你是说rootViewController 持有navigationController?即:@interface RootViewController : UINavigationController? 反过来。导航控制器包含 rootViewController。由于导航控制器是不可见的,看起来 rootViewController 是“***”控制器。将标签栏控制器推到导航堆栈上使标签栏现在看起来像“顶部”。查看基于 Xcode 导航的模板,了解 nav 和 rootViewController 如何交互。实现所需要做的就是将标签栏控制器推送为导航堆栈中的第二个控制器。 会的。希望我能到达那里。谢谢。

以上是关于如何将标签栏控制器放在视图控制器而不是委托中?的主要内容,如果未能解决你的问题,请参考以下文章

我在应用程序委托中加载的视图控制器(在导航控制器中)与标签栏重叠

在 Swift 中的标签栏上方显示 iAd 横幅

标签栏单击委托

使用标签栏控制器 -> 导航控制器 -> 视图层次结构 - iOS Swift 从应用程序委托呈现视图

长按而不是简单的轻按

将 UINavigationController 添加到 UITabBarController 而不在所有视图中显示标签栏