2012-09-05 9 views
5

Secondo Apple, posso combinare UINavigationController e UITabBarController utilizzando il codice, ad es.Devo usare un singolo UINavigationController per Tab Barra

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; 

In questa configurazione, solo VC4 ha la UINavigationController, ma cosa succede se voglio VC1-VC3 ha anche la UINavigationController?, Devo fare come ..

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; 

è questo l'approccio giusto?

+0

Beh, dipende se questo è quello che vuoi ... Non direi che l'approccio è sbagliato, ma forse non fornisce il risultato che ci si può aspettare e/o ci sono approcci migliori. Qual è il tuo obiettivo? – Saphrosit

+0

se devi navigare attraverso molte viste in una singola Scheda, allora dovresti usare il navigationController. Se si dispone di un singolo ViewController da mostrare per scheda, non utilizzare navigationController. Tutto dipende da quale sia la tua esigenza. –

risposta

1
- (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); 
} 

si può provare questo ....

+0

non dovrebbe essere: 'retval = [array NSArrayWithObjects: navigationController1, navigationController2, navigationController3, navigationController4, navigationController5, nil];' – viral

0

Si dovrebbe avere un'UINavigationController per ogni scheda della vostra TabBarController. Quindi il tuo secondo approccio è corretto. Non penso che sia possibile riutilizzare lo stesso controller di navigazione per tutte le schede.

0

Sì, il tuo approccio è corretto.

Se è necessario spostarsi tra le visualizzazioni in una scheda, tale scheda deve disporre di Controller di navigazione.

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

O saggia non c'è bisogno di navigazione Controller all'interno della scheda.

[arrTabs addObject:firstTabViewCtrl]; 
2

Sì, Howard, il tuo approccio va bene. Apple dice anche questo. Seguo lo stesso approccio mentre lavoro con UITabbarController con UINavigationController e funziona perfettamente per me.