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

假设在我的 iPhone 应用程序的一个标签视图中有一个 UIButton,我想让它在 TabBarController的标签栏中打开一个不同的标签。我该如何编写这样做的代码?

我假设我卸载了现有的视图并加载了一个特定的选项卡视图,但是我不确定如何准确地编写代码。

120533 次浏览

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

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

斯威夫特

self.tabBarController.selectedIndex = 1

目标-C

[self.tabBarController setSelectedIndex:1];

注意,选项卡是从0开始索引的

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

去酒吧的第五个账单。

我的意见是,selectedIndex或使用 objectAtIndex不一定是最好的方式来切换标签。如果你重新排序你的标签,一个硬编码的索引选择可能会扰乱你以前的应用程序行为。

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

tabBarController.selectedViewController = myViewController

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

对于可能要移动选项卡的情况,这里有一些代码。

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

我尝试了迪斯科 S2的建议,它是接近,但这是什么最终为我工作。这是在另一个选项卡中完成一个操作后调用的。

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

我希望能够指定哪个选项卡显示的类,而不是索引,因为我认为它是一个健壮的解决方案,不太依赖于您如何连接 IB。我既没有发现迪斯科的方法,也没有发现乔德的方法,所以我创造了这个方法:

-(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]];

希望这对某些人有帮助

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;


}


}

就像斯图尔特•克拉克(Stuart Clark)的解决方案一样,只不过是针对《迅速反应3》(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 链接到导航控制器后面的 viewController:

if let controller is T {

就像 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
}

像这样使用它(“人类”和“机器人”也必须在故事板中为特定的视图控制器和它的恢复 ID 设置,或者使用故事板 ID 并检查“使用故事板 ID”作为恢复 ID) :

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

请注意,我的 tabController 链接到导航控制器后面的 viewController:

if controller.restorationIdentifier == id {
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)
}






}

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

tabBarController.selectedIndex = 2

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

override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}