2010-04-15 6 views
1

J'essaie d'écrire une application qui utilise une barre de navigation et une barre d'onglets dans ce que (je suis en train de rassembler) est une manière inhabituelle. Fondamentalement, j'ai plusieurs "pages" ("maison", "paramètres", etc) qui ont chacun leur propre onglet. Je voudrais également l'avoir pour que la page "home" soit la vue racine de la barre de navigation, et les autres pages sont les vues de second niveau de la barre de navigation. En d'autres termes, je devrais pouvoir accéder à n'importe quelle page en cliquant sur l'élément de la barre d'onglets approprié et pouvoir accéder à la page d'accueil à partir de n'importe quelle autre page en cliquant sur le bouton Précédent de la barre de navigation.Application iPhone avec barre d'onglets et barre de navigation comme pairs

Actuellement, j'ai un UINavigationBar (via un UINavigationController) et un UITabBar (via un UITabController) en tant qu'enfants d'un UIView. Les contrôleurs de vue des différentes pages sont définis comme la propriété viewControllers du contrôleur d'onglet et le contrôleur de la page d'accueil est également défini comme vue racine du contrôleur de navigation. La balise de chaque vue de page est définie sur son index dans le contrôle onglet. J'ai la logique suivante dans le délégué du contrôleur onglet didSelectViewController méthode:

- (void) tabBarController:(UITabBarController*) tabBarController 
    didSelectViewController:(UIViewController*) viewController 
{ 
    if ([navController.viewControllers count] > 1) 
     [navController popViewControllerAnimated:NO]; 

    [navController pushViewController:viewController animated:YES]; 
} 

En outre, dans la méthode de délégué du contrôleur de navigation didShowViewController, j'ai le code suivant:

- (void) navigationController:(UINavigationController *) navigationController 
    didShowViewController:(UIViewController *)viewController 
    animated:(BOOL)animated 
{ 
    tabController.selectedIndex = viewController.view.tag; 
} 

Le problème qui se produit est que lorsque Je cours ceci, la barre de navigation, la barre d'onglets et la page d'accueil tous affichent ok, mais la barre d'onglets ne répondra pas à l'entrée - je ne peux pas choisir un autre onglet. Je pense qu'il est plus habituel d'avoir la barre d'onglets comme enfant du contrôle de navigation, ou vice versa. Cela ne semble pas correspondre à mon approche, car je ne veux pas avoir à créer individuellement le contrôle subordonné chaque fois qu'une modification survient dans le contrôle parent - par exemple: recréer une barre d'onglets chaque fois que la barre de navigation change.

Est-ce que quelqu'un a des suggestions quant à ce qui ne va pas et comment le réparer? Il me manque probablement quelque chose d'évident, mais peu importe, je n'arrive pas à le trouver. Merci!

EDIT: Je suppose qu'il a quelque chose à voir avec les deux contrôleurs essayant d'avoir la propriété du contrôleur de page, mais je ne peux pas pour la vie de moi trouver un moyen de contourner le problème.

Répondre

1

Yikes. Vous êtes hors de question ici. J'ai appris à la dure que UINavigationController et UITabBarController ne sont pas très accommodants lorsque vous essayez de les utiliser de manière non standard. UINavigationBar et UITabBar n'ont pas été conçus pour coexister en tant que frères et sœurs dans la hiérarchie de vues. Ils veulent vraiment être cousins ​​lointains. Peut-être que l'approche que vous poursuivez peut fonctionner d'une façon ou d'une autre, mais personnellement, je ne l'essaierais même pas. Cela dit, je vais vous suggérer une chose que vous pouvez vérifier, et ensuite je vais vous dire comment j'aborderais le problème.

Avez-vous implémenté et retournez-vous YES à partir de tabBarController: shouldSelectViewController: dans votre UITabBarControllerDelegate? Sinon, cela empêcherait vos onglets de basculer.

En supposant que ne résoudra pas tous vos problèmes, voici ce que je ferais pour obtenir le comportement que vous êtes à la recherche:

  1. Créer une UITabBarController et définir son point de vue que la vue racine de votre fenêtre.Avoir un UINavigationController séparé sous chaque onglet, chacun avec sa propre barre de navigation. (Ceci est la manière standard d'utiliser conjointement UINavigationController et UITabBarController.)

  2. Définissez un UITableViewController qui affiche une copie identique de votre table de menu principal en tant que contrôleur de vue racine pour chaque contrôleur de navigation. Lorsqu'une ligne est sélectionnée sur votre contrôleur de vue "Maison", passez à l'onglet de contenu associé.

  3. Définissez un délégué sur votre UITabBarController. Dans sa méthode tabBarController: didSelectViewController, appelez pushViewController: animated :. Ceci est similaire à ce que vous faites actuellement, sauf que vous l'appelez sur (UINavigationController *) tabBarController.selectedViewController.

  4. Dans viewDidAppear: animé: des contrôleurs de vue racine de vos onglets de contenu, passez à l'onglet "Accueil". De cette façon, lorsque l'utilisateur clique sur le bouton de retour pour revenir à "Accueil", il passera à l'onglet de droite. (Vous pouvez aussi avoir besoin du code conditionnel pour éviter que cela se produise lorsque l'utilisateur choisit d'abord un onglet contenu. Je ne suis pas sûr.)

Je serai curieux de savoir si Apple accepte ce comportement non standard. Revenez et laissez-nous savoir. Aussi, laissez-nous savoir si votre approche fonctionne d'une manière ou d'une autre.

+0

Je pense que je pourrais faire les choses à votre façon. J'ai trouvé une solution potentielle en utilisant un UINavigationBar et un UITabBar "nus", mais cela pose beaucoup trop de problèmes à implémenter. Je rapporterai quand quelque chose fonctionnera. – Mac

Questions connexes