如何将标签栏控制器放在视图控制器内而不是代理?

时间:2011-03-09 18:06:32

标签: iphone ios uitabbarcontroller uiapplicationdelegate

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

  1. App Delegate加载......
  2. 游戏根视图控制器(这只是2个按钮,“开始游戏”和“继续游戏”)
  3. 单击开始游戏按钮时,加载RootViewController。
  4. 带有标签栏控制器的Root View Controller ??
  5. 我真的不确定游戏如何在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. App Delegate
    2. 加载由...等制作的所有启动画面,积分
    3. 加载开始游戏,继续游戏屏幕并处理这些创建的操作
    4. 使应用程序委托窗口将标签栏控制器添加到self.window。
    5. 但我不确定。我想澄清/理解我是否可以将标签栏控制器放在视图控制器中,或者它们是否只能在应用程序委托中使用?

1 个答案:

答案 0 :(得分:3)

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

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

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

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