Переключение на вкладку TabBar программно?

Скажем, у меня есть UIButton в одной вкладке в моем приложении iPhone, и я хочу, чтобы он открыл другую вкладку в панели вкладок TabBarController. Как написать код для этого?

Я предполагаю, что я выгружаю существующее представление и загружаю определенное представление табуляции, но я не уверен, как правильно писать код.

Ответ 1

Попробуйте этот код в Swift или Objective-C

стриж

self.tabBarController.selectedIndex = 1

Objective-C

[self.tabBarController setSelectedIndex:1];

Ответ 2

Обратите внимание, что вкладки индексируются начиная с 0. Таким образом, следующий фрагмент кода работает

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

переходит на пятую вкладку в панели.

Ответ 3

Вы можете просто установить свойство selectedIndex в UITabBarController на соответствующий индекс, и представление будет изменено так же, как пользователь нажал кнопку вкладки.

Ответ 4

Мое мнение состоит в том, что selectedIndex или использование objectAtIndex не обязательно лучший способ переключить вкладку. Если вы измените порядок своих вкладок, выбор индекса с жестким кодированием может испортиться с вашим прежним поведением приложения.

Если у вас есть ссылка на объект контроллера просмотра, с которым вы хотите переключиться, вы можете сделать:

tabBarController.selectedViewController = myViewController

Конечно, вы должны убедиться, что myViewController действительно находится в списке tabBarController.viewControllers.

Ответ 5

Я попробовал, что предложил Disco S2, это было близко, но это то, что в конечном итоге работало для меня. Это вызвано после завершения действия внутри другой вкладки.

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

Ответ 6

В случаях, когда вы можете перемещать вкладки, вот какой-то код.

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

Ответ 7

Я хотел бы указать, какая вкладка была показана классом, а не индексом, поскольку я думал, что это сделано для надежного решения, которое в меньшей степени зависит от того, как вы подключаете IB. Я не нашел решения Disco или Joped для работы, поэтому я создал этот метод:

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

вы вызываете это следующим образом:

[self setTab:[YourClass class]];

Надеюсь, что это поможет кому-то

Ответ 8

Использовать в файле 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;

    }

}

Ответ 9

Как и решение Стюарта Кларка, но для 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
}

Используйте это так:

setTab(MyViewController.self)

Обратите внимание, что моя tabController ссылается на viewControllers за навигационными контроллерами. Без navigationControllers это выглядело бы так:

if let controller is T {

Ответ 10

Как и решение Stuart Clark, но для Swift 3 и с использованием идентификатора восстановления, чтобы найти правильную вкладку:

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
}

Используйте его следующим образом ("Люди" и "Роботы" также должны быть установлены в раскадровке для определенного viewController и его идентификатора восстановления, или используйте идентификатор раскадровки и отметьте "использовать идентификатор раскадровки" в качестве идентификатора восстановления):

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

Обратите внимание, что моя tabController ссылается на viewControllers за навигационными контроллерами. Без navigationControllers это выглядело бы так:

if controller.restorationIdentifier == id {

Ответ 11

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)
}



}

Ответ 12

Моя проблема немного отличается, мне нужно переключиться с одного childViewController в 1-й tabBar на домашний viewController 2-й tabBar. Я просто использую решение, предоставленное наверху:

tabBarController.selectedIndex = 2

Однако, когда он переключился на домашнюю страницу 2-й вкладки, контент становится невидимым. И когда я отлаживаю, viewDidAppear, viewWillAppear, viewDidLoad, ни один из них не вызывается. Я решил добавить следующий код в UITabBarController:

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}