0

Je développe une application pour iOS5 et plus et je n'utilise pas de story-boards ou IB. Je crée un UITabBarController personnalisé et dans mon AppDelegate je mets dedans 4 contrôleurs de vue avec seulement 1 UINavigationController (ne peut pas dire pourquoi).UITabBarController et UINavigationController personnalisés

Il en résulte un comportement où je peux pousser nouveau VC seulement à partir du premier onglet , qui est apparemment, dans une si UINavigationController appelé navController:

SGTabBarController *tabBarController = [[SGTabBarController alloc] init]; 

    SGHomeViewController* vc1 = [[SGHomeViewController alloc] init]; 
    SGChooseOSAgainViewController* vc3 = [[SGChooseOSAgainViewController alloc] init]; 
    SGSmsServicesViewController* vc4 = [[SGSmsServicesViewController alloc] init]; 
    SGSupportViewController *vc5 = [[SGSupportViewController alloc] init]; 
    navController = [[UINavigationController alloc] initWithRootViewController:vc1]; 

    NSArray* controllers = [NSArray arrayWithObjects:navController, vc3, vc4, vc5, nil]; 
    tabBarController.viewControllers = controllers; 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.rootViewController = tabBarController; 
    [navController setNavigationBarHidden:YES animated:NO]; 
    [self.window makeKeyAndVisible]; 

Pourquoi? Devrais-je créer un UINavigationController distinct pour chaque onglet? J'ai pris ce code dans la documentation d'Apple.

Répondre

2

Oui, vous pouvez. Essayez quelque chose comme ce code dans yourUITabBarController.m:

- (void)viewDidLoad 
{ 
   [super viewDidLoad]; 
        
   NSMutableArray* sectionViewControllers = nil; 
   NSArray* controllers = [self controllers]; 
   UIViewController* controller = nil; 
    
   for (controller in controllers) 
   { 
       if (sectionViewControllers == nil) 
           sectionViewControllers = [NSMutableArray arrayWithCapacity:0]; 
        
       UINavigationController* navigationController = [[UINavigationController allocWithZone:[self zone]] initWithRootViewController:controller]; 
        
       navigationController.navigationBarHidden = YES; 
        
       [sectionViewControllers addObject:navigationController]; 
       [navigationController release]; 
   } 
    
   self.viewControllers = sectionViewControllers; 
} 

- (NSArray*)controllers 
{ 
   if (!_controllers) 
       _controllers = [NSArray arrayWithObjects:[self tabController1], [self tabController2], nil]; 
   return _controllers; 
} 

et ce que vous AppDelegate.m:

self.window.rootViewController = self.yourUITabBarController; 
+0

Parfait! Je vais essayer et rapporter! –

2

Dois-je créer une UINavigationController distincte pour chaque onglet

Si vous souhaitez naviguer dans chaque onglet, OUI vous devez ajouter chaque viewController embarqué dans un NavigationController.

0

Référez ma réponse (Vidyanand) par lien ci-dessous

UITabBarController Issue

if (! Self.tabBarController) self.tabBarController = [[UITabBarController alloc] init];

self.tabBarController.delegate = self;

NSMutableArray * localcontrollerarray = [[NSMutableArray alloc] initWithCapacité: 2];

UIViewController * viewController1 = [[HomeViewController alloc] initNithNibName: @ "Kit HomeViewController": nil];

UINavigationController * navi1 = [[UINavigationController alloc] initWithRootViewController: viewController1];

[localcontrollerarray addObject: navi1];

UIViewController * viewController2 = [[ScanViewController alloc] initNithNibName: @ "Ensemble ScanViewController": nil];

UINavigationController * navi2 = [[UINavigationController alloc] initWithRootViewController: viewController2];

[localcontrollerarray addObject: navi2];

self.tabBarController.viewControllers = localcontrollerarray;

[self.window addSubview: self.tabBarController.view];

1

Supposons que vous ayez un tabbarController.Maintenant vous pouvez ajouter n'importe quel viewController ou n'importe quel NavController dans votre tabController. NavController peut contenir viewController. Mais vous pourriez avoir une confusion où vous utiliserez navController ou viewController. Vous utiliserez viewController là où vous n'avez pas besoin de navigation, je veux dire où vous n'avez pas besoin.

Voici un exemple de code dans lequel la première vue contient uniquement une vue et la deuxième vue contient un contrôleur de navigation. Vous ne pouvez pas pousser la nouvelle vue en première vue, mais vous pouvez facilement pousser la nouvelle vue en deuxième vue.

-(void)addTabBarControllers 
{ 
    UIViewController *viewController1, *viewController2; 

    viewController1 = [[[HomeView alloc] initWithNibName:@"HomeView" bundle:nil] autorelease]; 
    viewController2 = [[[FloorPlanHome alloc] initWithNibName:@"FloorPlanHome" bundle:nil] autorelease]; 


    UINavigationController *nav2 = [[UINavigationController alloc] initWithRootViewController:viewController2]; 

    self.tabBarController = [[[UITabBarController alloc] init] autorelease]; 
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1, nav2, nil]; 

    [[self.tabBarController.tabBar.items objectAtIndex:0] setTitle:@"First View"]; 
    [[self.tabBarController.tabBar.items objectAtIndex:1] setTitle:@"Second View"]; 


    [[self.tabBarController.tabBar.items objectAtIndex:0] setImage:[UIImage imageNamed:@"first.png"]]; 
    [[self.tabBarController.tabBar.items objectAtIndex:1] setImage:[UIImage imageNamed:@"second.png"]]; 

    self.window.rootViewController = self.tabBarController; 
    [self.window makeKeyAndVisible]; 
} 

Appelez cette méthode à partir de didFinishLaunchingWithOptions dans AppDelegate. ici HomeView et FloorPlanView sont deux vues différentes, vous devez d'abord ajouter ces vues et le fichier de classe.

+0

Merci pour l'explication écrasante! –

Questions connexes