UINavigationController的多个根视图控制器?

时间:2011-09-20 16:06:03

标签: iphone ios uiviewcontroller uinavigationcontroller

我正在尝试在多个表视图之间切换,作为导航控制器的根目录。根据我的应用程序的设置,我想使用不同方法的不同数据集,并且希望将这些数据封装在单独的类中。

我的想法是将视图管理器类(UIViewController)设置为导航控制器的根视图控制器。在视图管理器中,我们检查设置以查看我们要加载的视图:

if([application_mode intValue]==APPLICATION_MODE_A){
    AViewController *aView = [[DeviceTableViewController alloc] init];
    [self.view insertSubview:aView.view atIndex:0];
}
else if([application_mode intValue]==APPLICATION_B){
    BViewController *bView = [[BViewController alloc] init];
    [self.view insertSubview.bView.view atIndex:0];
}
实际上,这实际上是将相应的视图插入到视图管理器中,代价是插入视图顶部的白条和导航栏上没有信息,即子视图未连接到导航控制器。 / p>

这样做的正确方法是什么?我真的不想有一个巨大的桌面视图!

2 个答案:

答案 0 :(得分:3)

您在哪里设置navigationController的rootViewController?你现在不能把它设置为AviewController的对象或BViewController的对象吗?您可能不需要中间UIViewController

我会在开头做:

//navigationController comes from a Xib or previous code
if([application_mode intValue]==APPLICATION_MODE_A){
    AViewController *aView = [[DeviceTableViewController alloc] init];
    navigationController.rootViewController = aView;
    [aView release];
}
else if([application_mode intValue]==APPLICATION_B){
    BViewController *bView = [[BViewController alloc] init];
    navigationController.rootViewController = bView;
    [bView release];
}

答案 1 :(得分:1)

由于没有视图控制器包含,我喜欢Jonah William博客中概述的方法:

http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/

您无法有效地将视图控制器置于另一个视图内;相反,我们使用类似的生命周期方法(viewDidLoad,viewDidAppear等)创建一些东西,并将这些方法从父级转发给子级。这个'psudo-viewcontroller'有一个view属性,我们使用UIView addSubView

将其作为子视图添加到父视图中

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/addSubview

通过这种方法,我们可以封装视图元素,在视图控制器中动态切换它们,在一个视图控制器中放置几个​​等等。这样,它们可以与导航堆栈分开考虑。这是一项工作,但在我看来,iOS 4中最干净的UI封装方法。