我应该为每个标签栏使用单独的UINavigationController

根据苹果 ,我可以结合UINavigationControllerUITabBarController使用的代码,例如

 MyViewController1* vc1 = [[MyViewController1 alloc] init]; MyViewController2* vc2 = [[MyViewController2 alloc] init]; MyViewController3* vc3 = [[MyViewController3 alloc] init]; MyNavRootViewController* vc4 = [[MyNavRootViewController alloc] init]; UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:vc4]; NSArray* controllers = [NSArray arrayWithObjects:vc1, vc2, vc3, navController, nil]; tabBarController.viewControllers = controllers; 

在这个设置中,只有vc4UINavigationController ,但是如果我想要vc1-vc3也有UINavigationController ?,我应该怎么做?

 MyViewController1* vc1 = [[MyViewController1 alloc] init]; UINavigationController* nv1 = [[UINavigationController alloc] initWithRootViewController:vc1]; MyViewController1* vc2 = [[MyViewController2 alloc] init]; UINavigationController* nv2= [[UINavigationController alloc] initWithRootViewController:vc2]; MyViewController1* vc3 = [[MyViewController3 alloc] init]; UINavigationController* nv3 = [[UINavigationController alloc] initWithRootViewController:vc3]; NSArray* controllers = [NSArray arrayWithObjects:nv1, nv2, nv3, nil]; tabBarController.viewControllers = controllers; 

这是正确的方法吗?

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.tabBarController = [[[UITabBarController alloc] init] autorelease]; self.tabBarController.viewControllers = [self initializeTabBarItems]; self.navigationController = [[UINavigationController alloc]init]; [self.navigationController setNavigationBarHidden:YES]; self.window.rootViewController = self.navigationController; [self.navigationController pushViewController:_tabBarController animated:YES]; [self.window makeKeyAndVisible]; return YES; } - (NSArray *)initializeTabBarItems { NSArray * retval; /* Initialize view controllers */ UIViewController *viewController1 = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease]; UIViewController *viewController2 = [[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil] autorelease]; UIViewController *viewController3 = [[[ThirdViewController alloc]initWithNibName:@"ThirdViewController" bundle:nil]autorelease]; UIViewController *viewController4 = [[[FourthViewController alloc] initWithNibName:@"FourthViewController" bundle:nil] autorelease]; UIViewController *viewController5 = [[[FivfthViewController alloc] initWithNibName:@"FivfthViewController" bundle:nil] autorelease]; /* Initialize navigation controllers */ UINavigationController * navigationController1 = [[UINavigationController alloc] initWithRootViewController:viewController1]; UINavigationController * navigationController2 = [[UINavigationController alloc] initWithRootViewController:viewController2]; UINavigationController * navigationController3 = [[UINavigationController alloc] initWithRootViewController:viewController3]; UINavigationController * navigationController4 = [[UINavigationController alloc] initWithRootViewController:viewController4]; UINavigationController * navigationController5 = [[UINavigationController alloc] initWithRootViewController:viewController5]; /* Release View Controllers */ [viewController1 release]; [viewController2 release]; [viewController3 release]; [viewController4 release]; [viewController5 release]; /* Stuff Navigation Controllers into return value */ retval = [NSArray arrayWithObjects:viewController1,viewController2,viewController3,viewController4,viewController5,nil]; /* Release Navigation Controllers */ [navigationController1 release]; [navigationController2 release]; [navigationController3 release]; [navigationController4 release]; [navigationController5 release]; return (retval); } 

你可以试试这个….

是的,霍华德,你的方法很好。 苹果也这样说。 在UITabbarControllerUINavigationController一起工作时,我也遵循同样的方法,这对我很好。

您的TabBarController的每个选项卡应该有一个UINavigationController。 所以你的第二种方法是正确的。 我不认为你可以重复使用相同的导航控制器的所有选项卡。

是的,你的方法是正确的。

如果你必须导航视图到选项卡那么该选项卡应该有导航控制器。

 UINavigationController * navigationCtrl = [[UINavigationController alloc] initWithRootViewController:firstTabViewCtrl]; [arrTabs addObject:navigationCtrl]; 

任何明智的是没有必要的导航控制器里面的标签。

  [arrTabs addObject:firstTabViewCtrl];