如何将根控制器移动到另一个控制器

时间:2011-03-09 16:54:29

标签: iphone objective-c

假设我在根级别测试过导航控制器。

- (void)applicationDidFinishLaunching:(UIApplication *)application  
{  
    self.window.rootViewController = self.navController;   //iOS4  
}

现在我想将它移动到选项卡控制器内的一个选项卡中(在更大的应用程序中)。我觉得我应该能够做到与上面相同的事情:

self.rootViewController = self.navController;    //pseudocode

内部说

- (void)viewDidLoad

只是删除代码。事实上,正确/优雅的方式是什么?通常书籍是指控制器的根控制器,我想知道如何访问它,因为我可以访问它的窗口。 (当然,我对此的理解可能是错误的。)

1 个答案:

答案 0 :(得分:1)

修订回答:

您确实可以根据需要在UI的其他位置插入主UIViewController的视图。

诀窍是尽早和/或以正确的方式做到这一点。 viewDidLoad不是正确的位置 - 当调用该方法时,通常需要使用主UIViewController实现。

有两个非常好的地方可以进行这种UI设置:

1)通过界面构建​​器(nib文件)

2)在你的UIViewController中实现loadView(请阅读Apple docs - 非常好的信息)。

这是一个或另一个,不要尝试同时为一个UIViewController做两个!

因此,在您的示例中,您可以使用界面构建器编辑包含标签栏控制器的笔尖。在普通的UIViewController中拖动作为选项卡控制器的子项,然后将UIViewController的“Class”属性编辑为MySpecialViewController(即UIViewController的子类)。就是这样,您的笔尖现在会将视图控制器添加到选项卡内的UI中。

要采用方法2),您需要在包含标签栏控制器UI的UIViewController的viewControllers方法中设置UITabBarController的loadView属性。

(我的原始答案如下)

在Apple提供的视图控制器(例如UINavigationController等)中,没有一种一致的命名方式来访问根视图控制器。但是文档会为您提供有关如何访问它们的信息;例如UINavigationController有一个名为viewControllers的属性,您可以访问该属性。

毫不客气地删除现有的视图控制器并将它们插入UI中的不同位置实际上并不是一个好主意。如果你往下走,你可能会遇到各种各样的悲伤(例如设备方向改变)。这不是Apple希望你采取的那种方式。

更好的方法是在不同的地方拥有您想要的视图控制器的几个不同的实例。如果他们需要访问相同的数据,他们共享相同的数据源。但它们是个体的,不同的例子。