2010-08-06 3 views
0

J'essaie de basculer par programme l'élément de la barre d'onglets. Le code suivant fonctionne très bien, mais je ne peux pas le faire fonctionner dans certaines situations:iPhoneDev, UITabBarController Problèmes SelectedIndex

self.tabBarController.selectedIndex = 0; 

Voici le problème:

J'ai un contrôleur de barre d'onglets avec deux classes UIViewController. Dans le second onglet, j'ai le code ci-dessus placé à l'intérieur d'une instruction if dans la méthode viewWillAppear. Le code ci-dessus fonctionne, mais cela ne fonctionne que si la vue n'a jamais été chargée. Donc, sur le premier onglet, j'ai un bouton. Lorsque ce bouton est enfoncé, je passe par programme au deuxième onglet. À ce stade, mon code fonctionne, et je reste essentiellement sur le premier onglet. Mais la commutation ne fonctionne pas après cette première fois. Cela ne fonctionne pas non plus si je sélectionne ce second onglet avant d'appuyer sur ce bouton. L'instruction IF que mon code est à l'intérieur se déclenche, mais l'onglet sélectionné ne change pas.

Toute aide serait appréciée. N'hésitez pas à demander des précisions si vous en avez besoin.

Merci!


Permettez-moi d'ajouter plus d'informations:

(1) Il est uniquement utilisé sur occassion rare. Le premier écran est un écran de recherche. Après avoir appuyé sur Rechercher, vous êtes automatiquement redirigé vers le deuxième onglet, à moins qu'il n'y ait aucun résultat, puis vous êtes alerté et vous restez là. (2) Le deuxième onglet conserve une liste de tous les éléments, si aucune recherche à restreindre n'a été effectuée, ou la liste des éléments restreints. De toute façon, cette liste est toujours disponible. Donc, même si je les arrête sur la page de recherche, s'ils oublient et cliquent sur l'autre onglet, ils seront informés qu'il n'y a pas d'éléments. À ce stade, j'aimerais les ramener à l'onglet un, en tant que convience seulement.

Ce n'est pas un gros problème, je peux m'en passer, et ce n'est pas l'horrible système de programmation que certains prétendent être. Je voulais juste ajouter cet élément de convienence utilisateur ...


Grâce à tc! J'ai utilisé la méthode suivante dans mon UITabBarControllerDelegate:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{ 

if(self.tabBarController.selectedIndex == 0){ 
    if([books count] == 0){ 

     [self alertNoResults]; 

     return(FALSE); 
    } 
} 
return(TRUE); 
} 

Travaillé comme un charme!

+0

pourquoi passer à l'onglet 0 lorsque l'onglet 1 apparaîtra? On dirait que vous êtes en train de jouer avec les mauvaises choses au mauvais endroit, à un point où l'API n'aime pas que cela se produise (en d'autres termes: quand vous voyez le message "la vue apparaîtra", ce n'est pas le meilleur moment une action totalement différente). Développer une approche plus propre. – mvds

+0

Il est seulement utilisé à de rares occasions, quand aucun résultat de recherche n'a été retourné, je veux retourner l'utilisateur automatiquement au premier écran. – IcyBlueRose

+0

Vous devriez vérifier cela avant de les envoyer au deuxième écran. Vous avez maintenant une sorte de "faire-défaire", alors que vous ne devriez rien faire en premier lieu. – mvds

Répondre

1

Vous changez d'onglet lors d'un changement d'onglet. Docteur au jambon.

Essayez d'implémenter le - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController de UITabBarDelegate; retourner NO s'il n'y a pas de résultats.

Sinon, faites la vérification dans -viewDidAppear: (il est plus probable de travailler). Si cela ne fonctionne pas, vous pouvez même utiliser performSelectorInBackground (mais attention - l'utilisateur peut toujours taper sur d'autres onglets!)

+0

Est-ce que la vue n'a pas apparu seulement être appelée la première fois que la vue est chargée? – IcyBlueRose

+0

Merci, cette méthode a bien fonctionné! Et, en note, mon application est maintenant terminée !! – IcyBlueRose

+0

Je pense que vous confondez viewDidLoad et viewDidAppear :. viewDidAppear: est appelé après viewWillAppear: et toute animation/set-up-etc. En particulier, je soupçonne que le changement d'onglet n'a pas encore eu lieu dans viewWillAppear :, donc la re-définition de l'index des onglets va causer des problèmes. –

Questions connexes