2010-10-17 3 views
3

Est-il possible dans l'iPhone de désélectionner tous les onglets d'un UITabBarController? Par exemple, mon application a une "page d'accueil" qui n'appartient à aucun des onglets de la barre d'onglets ci-dessous. Maintenant, lorsque l'utilisateur touche un onglet sur la barre d'onglets, je voudrais charger l'onglet correspondant. Est-ce possible ? J'ai déjà essayé:UITabBarController - comment faire "aucun onglet" sélectionné au démarrage?

self.tabBarController.tabBarItem.enabled = NO; self.tabBarController.selectedIndex = -1;

mais cela n'aide pas. D'autres solutions? S'il vous plaît ?

+0

possible dublicate de http://stackoverflow.com/questions/5647756/unhighlight-uitabbaritem-in-uitabbarcontroller –

Répondre

-1

L'affichage d'une barre d'onglets sans onglet sélectionné briserait l'expérience utilisateur. Une barre d'onglets devrait toujours avoir un élément sélectionné et montrer la page appropriée - tout le reste est confus. Par conséquent, si vous avez besoin d'afficher autre chose, vous devriez en faire un popover (c'est-à-dire une feuille coulissante à partir du bas) qui peut être ignorée.

+0

Je suis d'accord. Mais mon client veut ça! L'attente est de montrer une "page d'accueil" (contrôleur de vue séparé) et une barre d'onglets, sans aucun onglet sélectionné. Lorsque l'utilisateur clique sur n'importe quel onglet, le contrôleur de vue correspondant doit être chargé. c'est-à-dire, la page d'accueil doit être un contrôleur de vue qui n'appartient à aucun des onglets? des idées ? aidez s'il vous plaît? – tuttu47

+0

Je ne sais pas si cela sera accepté dans l'App Store, même si vous le faites fonctionner. Pourquoi ne pas essayer d'ajouter une vue au-dessus de TabControllerView au démarrage? –

+0

Regardez la partie de recherche de l'application Youtube sur iPad. (Si vous avez encore iOS5) – Robert

7

J'ai réussi à accomplir cela en utilisant KVO tours.

L'idée est simple: nous effectuons un traçage lorsque UITabBarController essaye de définir sa propriété selectedController et de la remettre immédiatement à zéro.

code Exemple:

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // Create the view controller which will be displayed after application startup 
    mHomeViewController = [[HomeViewController alloc] initWithNibName:nil bundle:nil]; 

    [tabBarController.view addSubview:mHomeViewController.view]; 
    tabBarController.delegate = self; 
    [tabBarController addObserver:self forKeyPath:@"selectedViewController" options:NSKeyValueObservingOptionNew context:NULL]; 

    // further initialization ... 
} 

// This method detects if user taps on one of the tabs and removes our "Home" view controller from the screen. 
- (BOOL) tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 
{ 
    if (!mAllowSelectTab) 
    { 
     [mHomeViewController.view removeFromSuperview]; 
     mAllowSelectTab = YES; 
    } 

    return YES; 
} 

// Here we detect if UITabBarController wants to select one of the tabs and set back to unselected. 
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (!mAllowSelectTab) 
    { 
     if (object == tabBarController && [keyPath isEqualToString:@"selectedViewController"]) 
     { 
      NSNumber *changeKind = [change objectForKey:NSKeyValueChangeKindKey]; 

      if ([changeKind intValue] == NSKeyValueChangeSetting) 
      { 
       NSObject *newValue = [change objectForKey:NSKeyValueChangeNewKey]; 

       if ([newValue class] != [NSNull class]) 
       { 
        tabBarController.selectedViewController = nil; 
       } 
      } 
     } 
    } 
} 

Cependant, une petite note: le premier contrôleur de vue depuis TabBar sera toujours chargé (bien que pour un temps très court), de sorte que son viewDidLoad et viewWillAppear seront appelés après le démarrage. Vous voudrez peut-être ajouter une certaine logique pour empêcher certaines initialisations que vous pourriez probablement faire dans ces fonctions jusqu'à l'affichage "réel" de ce contrôleur à la suite de l'utilisateur tap (en utilisant par exemple des variables globales ou NSNotificationCenter).

+0

Tout d'abord, vraiment désolé d'avoir répondu si tard. J'ai sauvé ma journée. J'ai cherché partout une solution appropriée! Cela fonctionne et cela fonctionne parfaitement. Mais j'ai juste un doute, j'ai essayé de placer le selectedController sélectionné à zéro directement dans le code (sans la méthode d'observateur), cela n'a jamais fonctionné. N'avez-vous pas deviné pourquoi? Et pouvez-vous s'il vous plaît m'expliquer la méthode de l'observateur? J'ai compris l'image globale, mais je ne l'ai pas compris ligne par ligne ... – tuttu47

Questions connexes