替换标签栏控制器的其中一个视图控制器

时间:2018-03-14 15:53:59

标签: ios swift uiviewcontroller uitabbarcontroller

我正在处理使用UITabBarController的应用程序,并且我已经为UITabBarController分配了3个ViewControllers。

我以编程方式构建此应用程序。在AppDelegate中,我创建了一个UITabBarController。然后我创建一个UINavigationController并将rootViewController设置为UITabBarController。

然后我将窗口rootViewController设置为UINavigationController

这是来自AppDelegate的代码:

    let mainViewcontroller = TabBarController()
    let navigationController = UINavigationController(rootViewController: mainViewcontroller)
    self.window = UIWindow(frame: UIScreen.main.bounds)
    self.window!.rootViewController = navigationController
    self.window?.makeKeyAndVisible()

现在我创建了3个viewControllers的实例,并将它们添加到UITabBarController的viewController列表中。我现在要做的是在按钮上显示一个新的不同的viewController,它不是分配给TabBar的3个viewControllers之一。我已经能够通过使用present(ViewController)方法实现这一点:

    newVC = UINavigationController(rootViewController: NewViewController())
    self.present(newVC, animated: true, completion: nil)

我遇到的问题是我希望viewController显示在UITabBarController后面。当我使用上面的present()时,viewController显示在viewController和TabBar上。我尝试通过执行self.tabBarController.present()和window.rootViewController.present来呈现viewController,我得到的结果与TabBar相同。我将不胜感激任何建议。感谢

1 个答案:

答案 0 :(得分:0)

我创建了一个自定义的Tab栏,它是我的应用程序中UITabBarController的子类。它具有以下功能来处理像您这样的情况。

UITabBarController包含其子视图控制器的数组。必需的(外部)视图控制器被替换为当前可见的视图控制器,该视图控制器位于该数组的UITabBarController的选定索引处。然后将此更新后的数组设置回UITabBarController的子视图控制器数组

func setSelectedViewController(_ externalViewController: UIViewController) {

    var arrChildViewControllers = self.childViewControllers

    if arrChildViewControllers.count > 0 {

        let selectedTabIndex = self.selectedIndex
        arrChildViewControllers.replaceSubrange(selectedTabIndex...selectedTabIndex, with: [externalViewController])

        self.viewControllers = arrChildViewControllers
    }

}