以编程方式切换到TabBar选项卡视图?

时间:2011-03-24 01:04:44

标签: iphone objective-c ios uitabbarcontroller

假设我的iPhone应用在一个标签页视图中显示UIButton,我想让它在TabBarController的标签栏中打开另一个标签页。我该如何编写代码来执行此操作?

我假设我卸载现有视图并加载特定的标签视图,但我不确定如何准确编写代码。

12 个答案:

答案 0 :(得分:377)

在Swift或Objective-C中尝试此代码

<强>夫特

self.tabBarController.selectedIndex = 1

Objective-C

[self.tabBarController setSelectedIndex:1];

答案 1 :(得分:20)

请注意,标签从0开始编制索引。因此,以下代码段可以正常工作

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

转到栏中的第五个标签。

答案 2 :(得分:10)

我的观点是selectedIndex或使用objectAtIndex不一定是切换标签的最佳方式。如果您重新排序选项卡,硬编码索引选择可能会破坏您以前的应用程序行为。

如果您有要切换到的视图控制器的对象引用,则可以执行以下操作:

tabBarController.selectedViewController = myViewController

当然,您必须确保myViewController确实位于tabBarController.viewControllers列表中。

答案 3 :(得分:9)

您只需将UITabBarController上的selectedIndex属性设置为适当的索引,就会像用户点击标签按钮一样更改视图。

答案 4 :(得分:3)

我尝试过迪斯科S2的建议,它很接近,但这最终为我工作了。在完成另一个标签内的操作后调用此方法。

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

答案 5 :(得分:2)

对于您可能正在移动标签的情况,这里有一些代码。

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

答案 6 :(得分:1)

我希望能够指定哪个选项卡是按类显示而不是索引,因为我认为这是一个强大的解决方案,而不是依赖于如何连接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]];

希望这对某人有帮助

答案 7 :(得分:0)

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;

    }

}

答案 8 :(得分:0)

像Stuart Clark的解决方案,但对于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链接到navigationControllers后面的viewControllers。如果没有navigationControllers,它将如下所示:

if let controller is T {

答案 9 :(得分:0)

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

像这样使用它(&#34;人类&#34;和#34;机器人&#34;还必须在故事板中设置特定的viewController及其恢复ID,或使用Storyboard ID并检查& #34;使用故事板ID&#34;作为恢复ID):

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

请注意我的tabController链接到navigationControllers后面的viewControllers。如果没有navigationControllers,它将如下所示:

if controller.restorationIdentifier == id {

答案 10 :(得分:0)

paste0

答案 11 :(得分:0)

我的问题有点不同,我需要从第一个tabBar中的一个childViewController切换到第二个tabBar的主viewController。我只是使用楼上提供的解决方案:

tabBarController.selectedIndex = 2

但是,当切换到第二个tabBar的主页时,内容是不可见的。当我调试viewDidAppear,viewWillAppear,viewDidLoad时,没有一个被调用。 我的解决方案是在UITabBarController中添加以下代码:

override var shouldAutomaticallyForwardAppearanceMethods: Bool 
{
    return true
}