contrôleur de barre d'onglets dans un contrôleur de navigation, ou le partage d'une vue racine de navigation

StackOverflow https://stackoverflow.com/questions/576764

Question

Je suis en train de mettre en œuvre une interface utilisateur structurée comme dans Tweetie application, qui se comporte comme si: le contrôleur de vue de niveau supérieur semble être un contrôleur de navigation, dont la vue racine est un « Comptes "vue de tableau. Si vous cliquez sur un compte, il va au deuxième niveau, qui a une barre d'onglets dans la partie inférieure. Chaque élément de l'onglet affiche une liste différente et vous permet d'explorer plus bas (les niveaux suivants ne montrent pas la barre d'onglets).

Alors, cela semble être la hiérarchie de mise en œuvre est:

  • UINavigationController
    1. Comptes : UITableViewController
    2. UITabBarController
      1. Tweets : UITableViewController
        • Vue détaillée d'un tweet / user / etc
      2. Réponses : UITableViewController
      3. ...

Cela semble fonctionner [^ 1], mais semble être non pris en charge en fonction de la documentation du SDK pour -pushViewController:animated: (italique ajouté):

  

viewController : Le contrôleur d'affichage qui est poussé sur la pile. Il ne peut pas être une instance de contrôleur de barre d'onglets.

Je voudrais éviter des API privées et autres, mais je ne sais pas pourquoi cet usage est explicitement interdit même quand il semble fonctionner très bien. Quelqu'un sait la raison?

I ai pensé à mettre le contrôleur de barre d'onglets en tant que dispositif de commande principal, à chacun des onglets contenant des contrôleurs de navigation séparés. Le problème est que chaque contrôleur de navigation doit partager un seul contrôleur de vue racine (à savoir la table « Comptes » dans Tweetie ) - cela ne semble pas fonctionner: pousser le contrôleur de table à une second dispositif de commande de navigation semble pour l'enlever de la première. Sans parler de tous la tenue de livres lors de la sélection d'un autre compte serait probablement une douleur.

Comment dois-je mettre en œuvre ce droit chemin?

[^ 1]: Le contrôleur de barre d'onglet doit être sous-afin que l'onglet du point de navigation du contrôleur de barre à ce niveau reste en phase avec l'élément de navigation de l'onglet sélectionné, et le besoin du contrôleur de table de chaque onglet pour pousser leurs vues de détail respectifs à self.tabBarController.navigationController au lieu de self.navigationController.

Était-ce utile?

La solution

Les deux réponses précédentes avaient raison - je ne l'utilise pas dans UITabBarController Tweetie. Il est assez facile d'écrire un XXTabBarController personnalisé (sous-classe ordinaire de UIViewController) qui est heureux de se pousser sur une pile de contrôleur de navigation, mais vit toujours par la philosophie « du contrôleur de vue ». Chaque « onglet » dans la vue spécifique compte (Tweets / Replies / Messages) est son propre contrôleur de vue, et dans la mesure où ils sont concernés qu'ils s'interchangés à l'écran par un simple UITabBarController-ol.

Autres conseils

Je construis une application qui utilise un cadre de navigation similaire à Tweetie. J'ai écrit un post sur la façon de le faire sur mon blog www .wiredbob.com qui relie également le code source. Il est un modèle complet, vous pouvez prendre et utiliser comme base pour un autre projet. Bonne chance!

Il est possible d'ajouter un UITabBar à tout UIViewController. De cette façon, vous n'avez pas fait de pousser un UITabBarController et donc rester dans les lignes directrices de l'API d'Apple.

Dans l'interface constructeur UITabBar est sous "Windows, Vues & Bars" dans la bibliothèque Cocoa Touch.

Je le fais dans quelques de mes applications. L'astuce pour ajouter une barre d'onglets pour une application basée NavigationController est de ne pas utiliser un TabBarController. Ajouter un barre d'onglets à la vue, rendre le contrôleur de vue de ce point de vue une TabBarDelegate et de répondre aux sélections de l'utilisateur dans la barre d'onglet dans le code du contrôleur de vue.

J'utilise Bars Tab pour ajouter des vues supplémentaires à la vue de l'onglet Barre en tant que sous-vues, de recharger une vue de table avec différents ensembles de données, pour recharger un UIPickerView, etc.

Je luttais pour la dernière heure pour mettre en œuvre un UITabBar parce qu'il obtiendrait caché quand j'ai essayé d'afficher mon point de vue; je trouve cette message :

En fait, assurez-vous que vous insérez votre nouvelle vue en dessous de la barre d'onglets, par cette ligne de code:

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];

Dans mon application, le contrôleur de vue racine est un contrôleur de UINavigation. À un certain moment dans l'application, je dois afficher un UITabBar. J'ai essayé la mise en œuvre d'un UITabBar sur un UIView dans la hiérarchie de navigation, comme certains des messages précédents ont suggéré, et cela fonctionne. Mais je trouve que je voulais plus le comportement par défaut que le contrôleur onglet offre et j'ai trouvé un moyen d'utiliser le UITabBarController avec le contrôleur UINavigation:

1) Quand je veux afficher la vue du UITabBarController, je fais ceci:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;

2) Lorsque je veux revenir à où je me trouvais dans la hiérarchie de navigation, je fais ceci:

appDelegate.window.rootViewController = myNavControllerInstance;

Voici comment je l'ai fait. Cela pousse en fait un tabbarcontroller sur le contrôleur de navigation. Ça fonctionne bien. Je ne trouve nulle part dans la documentation que Apple ne supporte pas de cette façon. Quelqu'un peut-il me donner un lien vers cette mise en garde?

Si cela est vrai, est-il possible que Apple refuse de publier mon application à appstore?

-(void)setArrayAndPushNextController
{
    MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init];
    MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init];

    myFirstViewController.array = self.array;


    NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil];
    UITabBarController *tab = [[UITabBarController alloc] init];
    tab.viewControllers = array;

    [array release];

    UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1];
    UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2];

    myFirstViewController.tabBarItem = item1;
    mySecondViewController.tabBarItem = item2;

    [self stopAnimatingSpinner];

    [self.navigationController pushViewController:tab animated:YES];

    [tab release];
    [item1 release];
    [item2 release];
}

Ceci pourrait être réalisé en intégrant simplement le TabBarController dans le contrôleur de navigation. Dans le story-board:

  1. Faites glisser un ViewController
  2. Cliquez sur Scène du ViewController
  3. Cliquez sur l'éditeur >> Intégrer dans >> Navigation Controller.
  4. Faites glisser un bouton sur la même ViewController.
  5. Faites glisser un TabBarController
  6. Connectez le bouton du ViewController au TabBarController par bouton Segue action.

Dans ce cas, seul RootViewController de l'TabBarController serait dans la pile du contrôleur de navigation. Tous les TabBarItems auraient la barre de navigation en haut et l'utilisateur peuvent aller à l'écran d'accueil à tout moment, quel que soit le TabBarItem sélectionné

Cela pourrait se faire à tout ViewController dans la pile du contrôleur de navigation.

Si cela fonctionne, s'il vous plaît me suggérer la façon d'augmenter la réputation afin que je puisse afficher les images et le code dans la réponse suivante. :)

J'ai écrit un billet de blog sur la façon dont je me suis approché ce problème. Pour moi, en utilisant une vue modale est une solution plus simple que d'écrire une implémentation personnalisée onglet barre.

http://www.alexmedearis.com/uitabbarcontroller-inside-a-uinavigationcontroller /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top