web-dev-qa-db-fra.com

Basculer vers un onglet TabBar par programme?

Supposons que j'ai une UIButton dans un onglet de mon application iPhone et que je souhaite le faire ouvrir un onglet différent dans la barre d'onglets de TabBarController. Comment pourrais-je écrire le code pour le faire? 

Je suppose que je décharge la vue existante et charge un onglet spécifique, mais je ne sais pas comment écrire le code avec précision.

143
rottendevice

Essayez ce code dans Swift ou Objective-C

Rapide

self.tabBarController.selectedIndex = 1

Objectif c  

[self.tabBarController setSelectedIndex:1];
367
Jordan

Notez que les onglets sont indexés à partir de 0. L’extrait de code suivant fonctionne donc

tabBarController = [[UITabBarController alloc] init];
.
.
.
tabBarController.selectedViewController = [tabBarController.viewControllers objectAtIndex:4];

passe au cinquième onglet de la barre.

20
John Smith

Mon opinion est que selectedIndex ou d'utiliser objectAtIndex n'est pas nécessairement le meilleur moyen de changer de tabulation. Si vous réorganisez vos onglets, une sélection d'index codée en dur peut perturber le comportement de votre ancienne application.

Si vous avez la référence d'objet du contrôleur de vue vers lequel vous voulez basculer, vous pouvez faire:

tabBarController.selectedViewController = myViewController

Bien sûr, vous devez vous assurer que myViewController figure vraiment dans la liste de tabBarController.viewControllers.

9
ThomasT

Vous pouvez simplement simplement définir la propriété selectedIndex sur le UITabBarController sur l'index approprié et la vue sera modifiée de la même manière que l'utilisateur a appuyé sur le bouton d'onglet.

9
Alex Deem

J'ai essayé ce que Disco S2 avait suggéré, c'était proche mais c'est ce qui a fini par fonctionner pour moi. Cela a été appelé après avoir terminé une action dans un autre onglet.

for (UINavigationController *controller in self.tabBarController.viewControllers)
{
    if ([controller isKindOfClass:[MyViewController class]])
    {
        [self.tabBarController setSelectedViewController:controller];
        break;
    }
}
3
Joped

Dans les cas où vous déplacez les onglets, voici du code.

for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
            if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
                [self.tabBarController setSelectedViewController:controller];
                break;
            }
        }
2
StuStirling

Je voulais pouvoir spécifier quel onglet était affiché par classe plutôt que par index, car je pensais que cela constituait une solution robuste, moins dépendante de la manière dont vous câblez IB. Je n'ai trouvé aucune solution de Disco ou de Joped qui fonctionne, alors j'ai créé cette méthode:

-(void)setTab:(Class)class{
    int i = 0;
    for (UINavigationController *controller in self.tabBarContontroller.viewControllers){
        if ([controller isKindOfClass:class]){
            break;
        }
        i++;
    }
    self.tabBarContontroller.selectedIndex = i;
}

vous l'appelez comme ça:

[self setTab:[YourClass class]];

J'espère que cela est utile à quelqu'un

1
Stuart Clark
import UIKit

class TabbarViewController: UITabBarController,UITabBarControllerDelegate {

//MARK:- View Life Cycle

override func viewDidLoad() {
    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

//Tabbar delegate method
override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    let yourView = self.viewControllers![self.selectedIndex] as! UINavigationController
    yourView.popToRootViewController(animated:false)
}



}
0

Utiliser dans le fichier AppDelegate.m:

(void)tabBarController:(UITabBarController *)tabBarController
 didSelectViewController:(UIViewController *)viewController
{

     NSLog(@"Selected index: %d", tabBarController.selectedIndex);

    if (viewController == tabBarController.moreNavigationController)
    {
        tabBarController.moreNavigationController.delegate = self;
    }

    NSUInteger selectedIndex = tabBarController.selectedIndex;

    switch (selectedIndex) {

        case 0:
            NSLog(@"click me %u",self.tabBarController.selectedIndex);
            break;
        case 1:
            NSLog(@"click me again!! %u",self.tabBarController.selectedIndex);
            break;

        default:
            break;

    }

}
0
Rakesh Singh

Comme la solution de Stuart Clark mais pour Swift 3:

func setTab<T>(_ myClass: T.Type) {
    var i: Int = 0
    if let controllers = self.tabBarController?.viewControllers {
        for controller in controllers {
            if let nav = controller as? UINavigationController, nav.topViewController is T {
                break
            }
            i = i+1
        }
    }
    self.tabBarController?.selectedIndex = i
}

Utilisez-le comme ceci:

setTab(MyViewController.self)

Veuillez noter que mon tabController renvoie à viewControllers derrière navigationControllers. Sans navigationControllers, cela ressemblerait à ceci:

if let controller is T {
0
David

Comme la solution de Stuart Clark mais pour Swift 3 et en utilisant l'identificateur de restauration pour trouver l'onglet correct:

private func setTabById(id: String) {
  var i: Int = 0
  if let controllers = self.tabBarController?.viewControllers {
    for controller in controllers {
      if let nav = controller as? UINavigationController, nav.topViewController?.restorationIdentifier == id {
        break
      }
      i = i+1
    }
  }
  self.tabBarController?.selectedIndex = i
}

Utilisez-le comme ceci ("Humans" et "Robots" doivent également être définis dans le storyboard pour un viewController spécifique et son ID de restauration, ou utilisez l'ID de Storyboard et cochez "utiliser l'ID de storyboard" comme ID de restauration):

struct Tabs {
    static let Humans = "Humans"
    static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)

Veuillez noter que mon tabController renvoie à viewControllers derrière navigationControllers. Sans navigationControllers, cela ressemblerait à ceci:

if controller.restorationIdentifier == id {
0
David

Mon problème est un peu différent, je dois passer d'un childViewController dans le 1er tabBar au home viewController du 2e tabBar. J'utilise simplement la solution fournie à l'étage supérieur:

tabBarController.selectedIndex = 2

Toutefois, lorsqu'il est passé à la page d'accueil de 2nd TabBar, le contenu est invisible. Et lorsque je débogue, viewDidAppear, viewWillAppear, viewDidLoad, aucun d'entre eux n'est appelé . Ma solution consiste à ajouter le code suivant dans UITabBarController:

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}
0
Jin