我有一个非常基本的 iPhone 应用程序,其中执行了以下步骤。
- 加载的 App Delegate...
- 游戏 Root View Controller (这只是 2 个按钮,“开始游戏”和“继续游戏”)
- 单击开始游戏按钮时加载 RootViewController。
- 带有标签栏 Controller 的 Root View Controller ??
我真的不确定游戏在 iPhone 应用程序中是如何做到这一点的,但以上是我最好的猜测。
我希望标签栏 Controller 只出现在 RootViewController 中,但无论我做什么我都不能让标签栏 Controller 出现在这个 View 中。
但是我可以让正常的标签栏出现。但这不是标签栏 Controller ,我需要控制每个标签的功能(导航 Controller 、表格 Controller 等)。
根据docs使用选项卡栏 Controller 的多种方法之一是通过应用程序的主窗口。但是它并没有说你是否可以在普通 View 中使用它;或者确实如何。
我尝试了几次尝试使标签栏 Controller 看起来无济于事。
例如,如果我这样做,在我的 GameRootViewController 按钮内;
-(IBAction) btnPress {
RootViewController *root = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
[self.view addSubview:root.tabBarController.view];
[root release];
}
什么都没有出现。
如果我尝试正常的做法:
[self.view addSubview:root.view];
出现了 View ,但我从未看到标签栏 Controller 。
这让我很困惑。
我认为游戏/应用程序可能会这样做:
- 应用代理
- 加载所有启动画面、致谢名单、...等等
- 加载开始游戏,继续游戏屏幕并处理这些创建的 Action
- 使应用委托(delegate)窗口将标签栏 Controller 添加到 self.window。
但我不确定。我想澄清/了解我是否可以将选项卡栏 Controller 放在 View Controller 内,或者它们只能在应用程序委托(delegate)内使用吗?
最佳答案
首先,不要将 Controller 与 View 混淆。 View 是 UI 的可见部分, Controller 是幕后不可见的对象。您不会将 Controller 放在 View 内部,也不会将 Controller 放在其他 Controller “内部”。相反, Controller 存在于各种层次结构中,这些层次结构的结构决定了哪些 View 在何时何地出现。
您正在以非标准方式使用标签栏(这可能会使用户感到困惑),但您需要将标签栏 Controller 放在导航 Controller 内,以便获得如下所示的层次结构:
navigationController (rootViewController)
-->TabBarController(secondController)
-->tabViewController1
-->tabViewController2
-->tabViewController3
因此,您的第一个可见 View 是由 navigationController 的 rootController 控制的按钮 View 。选择一个按钮后,它会将 TabViewController 推到导航堆栈上,这会在选中默认选项卡的情况下将选项卡栏带入 View 。 (请注意,您必须隐藏导航栏以使导航堆栈对用户不可见。)
关于iphone - 如何将选项卡栏 Controller 放在 View Controller 而不是委托(delegate)中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5250181/