Переключение на вкладку TabBar программно? - PullRequest
148 голосов
/ 24 марта 2011

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

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

Ответы [ 12 ]

379 голосов
/ 24 марта 2011

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

Swift

self.tabBarController.selectedIndex = 1

Objective-C

[self.tabBarController setSelectedIndex:1];
20 голосов
/ 24 марта 2011

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

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

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

11 голосов
/ 27 января 2014

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

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

tabBarController.selectedViewController = myViewController

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

9 голосов
/ 24 марта 2011

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

3 голосов
/ 09 мая 2015

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

for (UINavigationController *controller in self.tabBarController.viewControllers)
{
    if ([controller isKindOfClass:[MyViewController class]])
    {
        [self.tabBarController setSelectedViewController:controller];
        break;
    }
}
2 голосов
/ 19 ноября 2014

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

for ( UINavigationController *controller in self.tabBarController.viewControllers ) {
            if ( [[controller.childViewControllers objectAtIndex:0] isKindOfClass:[MyViewController class]]) {
                [self.tabBarController setSelectedViewController:controller];
                break;
            }
        }
1 голос
/ 15 мая 2018

Как и решение Стюарта Кларка, но для 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 за навигационными контроллерами.Без навигационных контроллеров это выглядело бы так:

if let controller is T {
1 голос
/ 03 августа 2015

Я хотел иметь возможность указать, какая вкладка должна отображаться по классу, а не по индексу, так как я думал, что это было сделано для надежного решения, которое в меньшей степени зависело от того, как вы подключили 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]];

Надеюсь, это кому-нибудь пригодится

0 голосов
/ 10 января 2019

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

tabBarController.selectedIndex = 2

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

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}
0 голосов
/ 23 октября 2018
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)
}



}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...