Iphone UINavigationController的多个根视图控制器?

Iphone UINavigationController的多个根视图控制器?,iphone,ios,uiviewcontroller,uinavigationcontroller,Iphone,Ios,Uiviewcontroller,Uinavigationcontroller,我正在尝试作为导航控制器的根在多个表视图之间切换。根据我的应用程序的设置,我想用不同的方法使用不同的数据集,并且更喜欢将它们封装在单独的类中 我的想法是将视图管理器类(UIViewController)设置为导航控制器的根视图控制器。在视图管理器中,我们检查设置以查看要加载的视图: if([application_mode intValue]==APPLICATION_MODE_A){ AViewController *aView = [[DeviceTableViewControlle

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

我的想法是将视图管理器类(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];
}
这实际上会将适当的视图插入到视图管理器中,代价是插入的视图顶部有一个白色条,导航栏上没有任何信息,即子视图未连接到导航控制器


正确的方法是什么?我真的不希望有一个巨大的表视图

在哪里设置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];
}

您在哪里设置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];
}

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

无法有效地将视图控制器放置在另一个视图控制器中;相反,我们使用类似的生命周期方法(viewDidLoad、ViewDidAspect等)创建一些东西,并将这些方法从父级转发给子级。此“psudo viewcontroller”具有一个视图属性,我们使用UIView addSubView将其作为子视图添加到父视图中

:


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

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

无法有效地将视图控制器放置在另一个视图控制器中;相反,我们使用类似的生命周期方法(viewDidLoad、ViewDidAspect等)创建一些东西,并将这些方法从父级转发给子级。此“psudo viewcontroller”具有一个视图属性,我们使用UIView addSubView将其作为子视图添加到父视图中

:


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

我在app delegate中设置了导航控制器的根视图控制器。如果我将根视图控制器设置为A或B,那么管理器就不存在了吗?我希望能够随意从A,B转换。我在操作中提到的经理类。。。控制我们转到哪个子视图的类是否确实需要该管理器?您何时知道要更改“应用程序模式”?如果是viewController,什么时候可以看到它的视图?应用程序的结构是一个选项卡控制器,一个选项卡是导航控制器,另一个选项卡是数据选择。根据选择的数据,我希望nav控制器的根视图是3个不同表视图中的一个,每个表视图以不同的方式操作数据,并具有不同的方法。我可以把它包装成一个大的表视图,但那样的话,它的可维护性就差多了。管理器是导航控制器和3个表视图之间的层。我建议您在appDelegate中创建一个方法来选择viewController(a或B)(我们称之为UpdateFirstAbrootViewController)。类似于我在回复中发布的内容。选择模式后,在dataSelectionController中,可以调用[(MyAppDelegate*)[[UIApplication sharedApplication]delegate]UpdateFirstAttabrotViewController];我真的认为在navigationController和3个表视图之间不需要层:)我在应用程序委托中设置了导航控制器的根视图控制器。如果我将根视图控制器设置为A或B,那么管理器就不存在了吗?我希望能够随意从A,B转换。我在操作中提到的经理类。。。控制我们转到哪个子视图的类是否确实需要该管理器?您何时知道要更改“应用程序模式”?如果是viewController,什么时候可以看到它的视图?应用程序的结构是一个选项卡控制器,一个选项卡是导航控制器,另一个选项卡是数据选择。根据选择的数据,我希望nav控制器的根视图是3个不同表视图中的一个,每个表视图以不同的方式操作数据,并具有不同的方法。我可以把它包装成一个大的表视图,但那样的话,它的可维护性就差多了。管理器是导航控制器和3个表视图之间的层。我建议您在appDelegate中创建一个方法来选择viewController(a或B)(我们称之为UpdateFirstAbrootViewController)。类似于我在回复中发布的内容。选择模式后,在dataSelectionController中,可以调用[(MyAppDelegate*)[[UIApplication sharedApplication]delegate]UpdateFirstAttabrotViewController];我真的认为在navigationController和3个表视图之间不需要一个层:)