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

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

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

我真的不确定游戏如何在 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];

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

这让我很困惑。

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

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

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

【问题讨论】:

    标签: iphone ios uitabbarcontroller uiapplicationdelegate


    【解决方案1】:

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

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

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

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

    【讨论】:

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