在自定义 UITabBarController (Swift) 中以编程方式导航

问题描述

我正在使用基于 Pavel Bogart solution自定义 UITabBarController:非常简单、有用且非常适合我需要做的事情。 除非我不知道如何管理一件事:如何以编程方式从 1 个 VC 切换到另一个(因此,没有触摸 tabBar 项目)。

我用 selectedindex = XmodalPresentationStyle = .fullScreen 尝试了一些函数,但没有什么真正具体的可以完全像我们只是在 UITabBarController 上触摸项目一样。

代码如下:

class MainTabBarController: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()
    setupTabBar()

}

var TabControllers = [VC1(),VC2(),VC3(),VC4(),VC5()]

func setupTabBar(){
    tabBar.backgroundColor = Theme.navBarBackgroundColor
    tabBar.isTranslucent = true
    tabBar.clipsToBounds = true
    
    let screen1 = createNavController(vc: TabControllers[0],selected: #imageLiteral(resourceName: "img1on"),unselected: #imageLiteral(resourceName: "img1off"),label: "Name1")
    let screen2 = createNavController(vc: TabControllers[1],selected: #imageLiteral(resourceName: "img2on"),unselected: #imageLiteral(resourceName: "img2off"),label: "Name2")
    let screen3 = createNavController(vc: TabControllers[2],selected: #imageLiteral(resourceName: "img3on"),unselected: #imageLiteral(resourceName: "img3off"),label: "Name3")
    let screen4 = createNavController(vc: TabControllers[3],selected: #imageLiteral(resourceName: "img4on"),unselected: #imageLiteral(resourceName: "img4off"),label: "Name4")
    let screen5 = createNavController(vc: TabControllers[4],selected: #imageLiteral(resourceName: "img5on"),unselected: #imageLiteral(resourceName: "img5off"),label: "Name5")
    
    viewControllers = [screen1,screen2,screen3,screen4,screen5]
    
    guard let items = tabBar.items else { return }
    for item in items {
        let unselectedItem = [NSAttributedString.Key.foregroundColor: Theme.darkTextColor]
        let selectedItem = [NSAttributedString.Key.foregroundColor: Theme.mainAccentColor]
        let attributes = [NSAttributedString.Key.font: UIFont(name: Theme.subTitle,size: 16)]
        item.setTitleTextAttributes(attributes as [NSAttributedString.Key : Any],for: .normal)
        item.setTitleTextAttributes(attributes as [NSAttributedString.Key : Any],for: .selected)
        item.setTitleTextAttributes(unselectedItem as [NSAttributedString.Key : Any],for: .normal)
        item.setTitleTextAttributes(selectedItem as [NSAttributedString.Key : Any],for: .selected)
    }
}

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    AppUtility.lockOrientation(.portrait)

}

override func viewWilldisappear(_ animated: Bool) {
    super.viewWilldisappear(animated)
    AppUtility.lockOrientation(.all)
}

}

及其扩展名:

extension UITabBarController {

func createNavController(vc: UIViewController,selected: UIImage,unselected: UIImage,label: String) -> UINavigationController {
    let viewController = vc
    let navController = UINavigationController(rootViewController: viewController)
    navController.tabBarItem.image = unselected
    navController.tabBarItem.selectedImage = selected
    navController.tabBarItem.title = label
    return navController
}

}

说说你的看法。

解决方法

很奇怪 selectedIndex 对您不起作用,我做了一个类似的解决方案,并且对我有用。

尝试正确引用您的根控制器(在本例中为您的 UITabBarController)和子控制器,并使用 strong 引用使它们保持活动状态。

我做了一个简单的项目来演示它。

Programmatic TabBarController repo

我希望我有所帮助!