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

Presenting NavigationController with TabBarViewController can not select index programmatically

提问人:Async- 提问时间:7/5/2019 最后编辑:Sohil R. MemonAsync- 更新时间:7/5/2019 访问量:112

问:

我正在尝试显示 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 都是 nil。如何切换到不同的选项卡?

iOS Swift iPhone UI导航控制器 SWIFT5

评论

0赞 Sohil R. Memon 7/5/2019
您知道选择索引将加载控制器,然后您正在呈现它,那么在呈现后选择控制器的目的是什么?UITabBarController
0赞 Async- 7/5/2019
只是尝试:我尝试在演示前选择,也不起作用。UITabBarController 为 nil
0赞 Sohil R. Memon 7/5/2019
我问你为什么要选择控制器,在演示后?
0赞 C00kieMonsta 7/5/2019
你不应该在主线程上异步调度它吗?DispatchQueue.main.async {...}
0赞 Async- 7/5/2019
我有两个选项卡,需要选择第二个选项卡。

答:

1赞 kstefanou 7/5/2019 #1

而不是打电话

present(navigationController, animated: true, completion: { })

在 中,尝试将其调入或viewDidLoadviewWillAppearviewDidAppear

3赞 Sohil R. Memon 7/5/2019 #2

您正在尝试访问 ,但您需要访问第一个控制器,并且从那里您需要以这种方式进行选择:UITabBarControllerUINavigationControllerUINavigationControllerUITabBar

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

让我知道这有帮助与否!

评论

0赞 Async- 7/5/2019
我实际上使用的是聊天视图控制器的 viewControllers,但它是用工厂制作的并传回这里(出于显而易见的原因,我简化了问题片段)。我怎样才能访问这里?chatViewController.viewControllers
0赞 Sohil R. Memon 7/5/2019
@Async- 我分配了它,因为我正在以编程方式创建 。以防万一,如果你的“ChatViewController”由控制器组成,那么你不需要分配它!您可以跳过该行。UIViewController
0赞 Async- 7/5/2019
它更复杂,因为我使用工厂,但我认为总的来说你的答案是正确的。
0赞 Frank Eno 7/5/2019 #3

试试这个 (Swift 5):

  1. 在 Storyboard 中为 UITabBarController 设置标识符,如下所示MainTabBar

  2. 在函数或 IBAction 中,使用以下代码:

    让 TBC = 情节提要?。instantiateViewController(withIdentifier: “MainTabBar”) 作为!UITabBar控制器

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

    present(tbc, 动画:false,完成:nil)