Answers:
在Swift或Objective-C中尝试此代码
迅速
self.tabBarController.selectedIndex = 1
目标C
[self.tabBarController setSelectedIndex:1];
-setSelectedViewController:
。
我的意见是selectedIndex
或使用objectAtIndex
不一定是切换选项卡的最佳方法。如果您对标签进行重新排序,则硬编码的索引选择可能会与您以前的应用行为混淆。
如果您具有要切换到的视图控制器的对象引用,则可以执行以下操作:
tabBarController.selectedViewController = myViewController
当然,您必须确保myViewController
确实在的列表中tabBarController.viewControllers
。
您只需selectedIndex
将UITabBarController上的属性设置为适当的索引,就可以像用户点击选项卡按钮一样更改视图。
selectedIndex
索引> 4的设置对我也不起作用,但是selectedViewController
可以。
像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 {
我希望能够指定按类别而不是按索引显示哪个选项卡,因为我认为它是一种健壮的解决方案,该解决方案较少依赖于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]];
希望这对某人有帮助
我的问题有点不同,我需要从第一个tabBar中的一个childViewController切换到第二个tabBar的主viewController。我只是使用楼上提供的解决方案:
tabBarController.selectedIndex = 2
但是,当切换到第二个tabBar的主页时,该内容是不可见的。当我调试viewDidAppear,viewWillAppear,viewDidLoad时,没有一个被调用。我的解决方案是在UITabBarController中添加以下代码:
override var shouldAutomaticallyForwardAppearanceMethods: Bool
{
return true
}
在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的解决方案,但对于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设置“人类”和“机器人”及其还原ID,或使用情节提要ID并选中“使用情节提要ID”作为还原ID):
struct Tabs {
static let Humans = "Humans"
static let Robots = "Robots"
}
setTabById(id: Tabs.Robots)
请注意,我的tabController链接到navigationControllers后面的viewControllers。如果没有navigationControllers,它将看起来像这样:
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)
}
}