it-swarm.com.ru

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

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

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

143
rottendevice

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

Свифт

self.tabBarController.selectedIndex = 1

Objective-C  

[self.tabBarController setSelectedIndex:1];
367
Jordan

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

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

идет к пятой вкладке в панели.

20
John Smith

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

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

tabBarController.selectedViewController = myViewController

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

9
ThomasT

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

9
Alex Deem

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

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

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

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

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

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

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
Davender Verma Soni

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

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

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

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

tabBarController.selectedIndex = 2

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

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}
0
Jin