Ios 使用TabBarViewController呈现NavigationController无法以编程方式选择索引

Ios 使用TabBarViewController呈现NavigationController无法以编程方式选择索引,ios,swift,iphone,uinavigationcontroller,swift5,Ios,Swift,Iphone,Uinavigationcontroller,Swift5,我正在尝试显示NavigationController并在完成块中选择第二个选项卡。我的代码是: let chatViewController = UITabBarController() let navigationController = UINavigationController(rootViewController: chatViewController) present(navigationController, animated: true, completion: {

我正在尝试显示NavigationController并在完成块中选择第二个选项卡。我的代码是:

let chatViewController = UITabBarController()
let navigationController = UINavigationController(rootViewController: chatViewController)

present(navigationController, animated: true, completion: {
    self.visibleViewController = navigationController
    self.visibleViewController?.tabBarController?.selectedIndex = 1
})
第二次尝试:

let chatViewController = UITabBarController()
let navigationController = UINavigationController(rootViewController: chatViewController)
navigationController.tabBarController?.selectedIndex = 1

present(navigationController, animated: true, completion: {
    self.visibleViewController = navigationController
})
在这两种情况下,tabBarController都为零。如何切换到其他选项卡?

而不是呼叫

presentnavigationController,动画:true,完成:{}

在viewDidLoad中,尝试在ViewWillDisplay或ViewDidDisplay中调用它

您正在尝试访问UINavigationController的UITabBarController,但您需要从UINavigationController访问第一个控制器,并从那里按如下方式选择UITabBar:

func showTabBarControllerr() {
    let chatViewController = UITabBarController()
    //Note: Make sure you have already added the Controllers in Tabbarcontroller
    chatViewController.viewControllers = [DemoOne(), DemoTwo()]
    let navigationController = UINavigationController(rootViewController: chatViewController)
    present(navigationController, animated: true, completion: {
        if let tabBarController = navigationController.viewControllers.first as? UITabBarController {
            tabBarController.selectedIndex = 1
        }
    })
}
让我知道这是否有用

试试这个Swift 5:

在故事板中为UITabBarController设置一个标识符,类似于MainTabBar

在函数或iAction中,使用以下代码:

让tbc=storyboard?.InstanceEviewController标识符:MainTabBar as!超宽带控制器

tbc.selectedIndex=1//这是控制器的索引

presenttbc,动画:false,完成:nil


您知道选择索引将在UITabBarController上加载控制器,然后您正在演示它,那么演示后选择控制器的目的是什么?只是尝试:我在演示之前尝试了选择,但也不起作用。UITabBarController是NIL。我想问的是,在演示之后,为什么要选择控制器?您不应该在主线程上异步调度它吗?DispatchQueue.main.async{…}我有两个选项卡,需要选择第二个选项卡。我实际上使用的是聊天视图控制器的ViewController,但它是由工厂制作的,并传递回这里。出于明显的原因,我简化了问题片段。如何在此处访问chatViewController.viewControllers?@Async-我分配了它,因为我是通过编程方式创建UIViewController的。在这种情况下,如果您的ChatViewController由控制器组成,则无需分配该控制器!你可以跳过这一行。这更复杂,因为我使用工厂,但我认为你的答案大体上是正确的。