7

Salut tout le monde, je suis nouveau dans le développement de l'iPhone et je ne comprends pas toute l'idée UINavigationController et UITabBarController. Est-ce qu'on se substitue à l'autre - comment les applications comme Tweetie combinent les deux? Je souhaite que mon application dispose d'une barre d'onglets persistante @ en bas (qui semble fonctionner), mais aussi d'une barre de navigation en haut qui permet de faire glisser/afficher des vues sur l'écran sans supprimer la barre d'onglets .Avoir un UITabBar ET un UINavigationController dans une application?

  • Comment puis-je accomplir ceci? À quoi devrait ressembler la hiérarchie dans IB en ce qui concerne MainWindow.xib en ce qui concerne tous ces contrôleurs?
  • Quelle est la meilleure pratique ici?

Merci beaucoup,

+3

droite de la bouche du codeur Tweetie: http://stackoverflow.com/questions/576764/tab-bar-controller-inside-a-navigation -controller-or-sharing-a-navigation-root-v – chrissr

Répondre

15

Il suffit d'entourer le contrôleur de vue à l'intérieur du UINavigationController et de placer le UINavigationController à l'intérieur du UITabBar. Cela fonctionne bien pour vous ...

Exemple:

NSMutableArray *tabBarViewControllers = [[NSMutableArray alloc] initWithCapacity:2]; 

tabBarController = [[UITabBarController alloc] init]; 
[tabBarController setDelegate:self]; 

UINavigationController *navigationController = nil; 
navigationController = [[UINavigationController alloc] initWithRootViewController:<Your View controller1>]; 
[tabBarViewControllers addObject:navigationController]; 
[navigationController release]; 
navigationController = nil; 

navigationController = [[UINavigationController alloc] initWithRootViewController:<Your View controller2>]; 
[tabBarViewControllers addObject:navigationController]; 
[navigationController release]; 
navigationController = nil; 

tabBarController = tabBarViewControllers; 
[tabBarViewControllers release]; 
tabBarViewControllers = nil; 
+0

Cela est beaucoup plus logique, chaque contrôleur de vue peut avoir son propre contrôleur de navigation pour afficher/ouvrir des vues. Je vous remercie! – barfoon

+0

@Manjunath: de cette façon, je ne parviens pas à nommer la barre de navigation et l'élément de la barre d'onglets avec deux noms différents. Y-a-t-il un moyen de faire ça? – Sefran

3

Utilisez l'assistant pour une barre d'onglets d'application, et le configurer comme normal. Dans n'importe quel onglet où vous voulez ajouter un contrôleur de navigation, créez-le dans le XIB en utilisant la bibliothèque. Mon XIB a:

- File's Owner   DescriptiveNameNavViewController 
- First Responder 
- View     UIVIew 
- Navigation Controller UINavigationController 
    - Navigation Bar  UINavigationBar 

Notez qu'il n'y a rien dans la vue. Voir viewDidLoad ci-dessous pour savoir où UINavigationController est attaché à l'UIView.

Dans le fichier d'en-tête de ViewController de Tab (que j'ai appelé ici DescriptiveNameNavViewController - il n'y a pas de standard particulier, mais j'utilise [Quelque chose] NavViewController pour me rappeler que ViewController contient un contrôleur de navigation avec . la pile de navigation Ceci est le nom du contrôleur que je situe dans le MainWindow.xib que l'assistant génère) Configurer une UINavigationController * IBOutlet qui a le dispositif de commande de navigation dans le XIB attaché à lui:

@interface DescriptiveNameNavViewController : UIViewController { 
    UINavigationController *navigationController; 
} 
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController; 

@end 

dans le contrôleur pour le DescriptiveNameNavViewController, faites quelque chose comme ceci:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[self view] addSubview:[navigationController view]]; 
    DescriptiveNameController *aController = [[[DescriptiveNameController alloc ] initWithNibName:@"DescriptiveNameController" bundle:nil ] autorelease]; 
    aController.title = @"Descriptive Title"; 

// 
// app stuff goes here. 
// 

    [self.navigationController pushViewController:aController animated:YES]; 
    [self.navigationController setDelegate:self]; 
} 

La définition du délégué dans le DescriptiveNameNavViewController est très importante, car sinon vous n'obtiendrez pas les méthodes appelées dans les instances DescriptiveNameViewController et tout autre élément que vous insérez dans la pile du contrôleur de navigation.

En DescriptiveNameNavViewController, mettre en œuvre les méthodes de UINavigationControllerDelegate comme celui-ci:

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if ([viewController respondsToSelector:@selector(viewDidAppear:)]) { 
     [viewController viewDidAppear:animated]; 
    } 
} 

Et cela provoquera des messages à se propager à des contrôleurs à l'intérieur du UINavigationController comme vous attendez. Il semble que beaucoup de problèmes que les gens rencontrent sont parce que viewDidAppear: ou d'autres méthodes ne sont pas appelées sur les ViewControllers poussés dans le NavigationController.

De toute façon, laissez-moi savoir si plus de détails aideraient.

+0

J'ai suivi cela et ça ne marche pas. Toujours pas d'obtenir cela à un niveau conceptuel. Lorsque je lance l'application et que je clique sur le second onglet, elle charge simplement la vue, et non une avec un contrôleur de navigation. En outre, le protocole UINavigationControllerDelegate est manquant dans votre en-tête. Pourquoi navigationController n'est-il pas défini comme un IBOutlet dans l'interface, mais IS dans la déclaration de propriété? – barfoon

+0

Il n'y a qu'un IBOutlet dans l'instruction @property parce que c'est là que le constructeur de l'interface le récupère. C'est une macro vide. Si vous obtenez une vue vide sur le deuxième panneau, c'est parce que le chargement du contrôleur de navigation dans viewDidLoad ne fonctionne pas. Quoi qu'il en soit, si la solution de chrissr fonctionne pour vous, il suffit de regarder les méthodes viewWill * et viewDid * qui ne sont pas propagées à vos sous-vues et si c'est le cas, implémentez le délégué. (Le protocole de délégué manquant était un méssage, mais les méthodes seraient appelées de toute façon.) – corprew

Questions connexes