从标签栏更改ViewController

Abe*_*eri 1 uitabbarcontroller uinavigationcontroller swift

我有一个UITabBarController带有3个标签的SettingsVC,您可以在其中选择外观MainVCViewControllers根据用户的喜好,有2种不同的外观应显示为MainVC)。

我制作了该应用程序,并且可以正常工作,但是它确实有问题,因为我只是相互推挤ViewControllers,在某些情况下,切换时会看到错误tabs

主板

在此处输入图片说明

这是我的代码的一部分(尝试了很多东西之后),该代码根据以下内容更改了VC UserDefaults

CheckSettingsStatus.swift

//
// Check for Double Column Settings and navigate to Double Column VC
//
func checkMainVCViewStatusAndNavigateAcordingly(){
    if UserDefaults.standard.integer(forKey: KEY_MAIN_VC_VIEW) == 1{
        //let appDel = UIApplication.shared.delegate as! AppDelegate
        //appDel.goToDoubleMainVC()

        let mainVC = storyboard?.instantiateViewController(withIdentifier: "DoubleColumnMainVC") as! DoubleColumnMainVC
        self.navigationController?.viewControllers[0] = mainVC
        //navigationController?.pushViewController(mainVC, animated: false)

        var navigationArray = self.navigationController?.viewControllers
        print("Number of VCs = \(String(describing: navigationArray?.count))")
        if navigationArray?.count == nil{
            self.navigationController?.pushViewController(mainVC, animated: false)
        }else{
            self.navigationController?.popToRootViewController(animated: false)
        }
        //            self.navigationController?.viewControllers = navigationArray!
    }
}


//
// same as function above but goes to MainVC
//
func checkDoubleColumnMainVCViewStatusAndNavigateAcordingly(){
    if UserDefaults.standard.integer(forKey: KEY_MAIN_VC_VIEW) == 0{
        //            let appDel = UIApplication.shared.delegate as! AppDelegate
        //            appDel.goToMainVC()
        let mainVC = storyboard?.instantiateViewController(withIdentifier: "MainVC") as! MainVC
        self.navigationController?.viewControllers[0] = mainVC

        var navigationArray = self.navigationController?.viewControllers
        print("Number of VCs = \(String(describing: navigationArray?.count))")
        if navigationArray?.count == nil{
            navigationController?.pushViewController(mainVC, animated: false)
        }else{
            self.navigationController?.popToRootViewController(animated: false)
        }
        //            self.navigationController?.viewControllers = navigationArray!
    }
}
Run Code Online (Sandbox Code Playgroud)

借助这两个控制器的ViewWillAppear中的控件,我调用这些函数进行相应的切换。

有什么想法我做错了吗?我可以从UITabBarController而不是NavigationController推送控制器吗?就像是:

tabBarController.pushViewController(mainVC, animated: false)
Run Code Online (Sandbox Code Playgroud)

代替:

navigationController.pushViewController(mainVC, animated: false)
Run Code Online (Sandbox Code Playgroud)

先感谢您

更新:

在最好的情况下,如果一切正常,在第一次启动应用程序(第二次启动mainVC)时,Buttonsin NavBar无效。

编辑:

我只是意识到NavigationBar我在上方看到的SecondMainVCNavigationBarfrom MainVC,这就是为什么按钮不起作用的原因。那怎么可能?

Mhm*_*izk 5

在尝试在情节提要中开发选项卡栏控制器时遇到了相同的问题,因此我发现最好的方法是通过代码实现它。因此您可以使代码看起来像这样:

1)创建一个UITabController的子类,并使其符合UITabBarControllerDelegate

  class TabBarVC: UITabBarController , UITabBarControllerDelegate {
Run Code Online (Sandbox Code Playgroud)

2)然后在您的类中编写此方法以初始化项目中的选项卡:

  private func settingUpTabBarAndInitializingViewControllers(){

    //self delagting
    self.delegate = self 

    //home tab
    let homeStoryboard = UIStoryboard(name: Constants.StoryBoards.homeStoryboard, bundle: nil)
    let homeVC = homeStoryboard.instantiateViewController(withIdentifier: Constants.ControllersIDs.homeScreen) as! HomeVC

    // shop tab
    let shopStoybaord = UIStoryboard(name: Constants.StoryBoards.shopStoryboard, bundle: nil)
    let shopVC = shopStoybaord.instantiateViewController(withIdentifier: Constants.ControllersIDs.shopScreen) as! ShopVC

    //offers tab
    let offersStoryboard = UIStoryboard(name: Constants.StoryBoards.offersStoryboard, bundle: nil)
    let offersVC = offersStoryboard.instantiateViewController(withIdentifier: Constants.ControllersIDs.offersScreen) as! OffersVC

    //more tab
    let moreStoryboard = UIStoryboard(name: Constants.StoryBoards.MoreScreenStoryboard, bundle: nil)
    let moreVC = moreStoryboard.instantiateViewController(withIdentifier: Constants.ControllersIDs.moreVCScreen) as! MoreOptionsTVC


    //setting VCs
    self.viewControllers = [homeVC , shopVC , offersVC , moreVC]


    //setting buttons

    //buttons images
    let homeImage = UIImage(named: "TabHome")
    let shopImage = UIImage(named : "TabShop")
    let offerImage = UIImage(named: "TabOffers")
    let moreImage = UIImage(named: "TabMenu")


    // buttons shakhsiyan
    let homeButton = UITabBarItem(title: homeText, image: homeImage, selectedImage: homeTappedImage)
    let shopButton = UITabBarItem(title: shopText, image: shopImage, selectedImage: shopTappedImage)
    let offersButton = UITabBarItem(title: offersText, image: offerImage, selectedImage: offersTappedImage)     
    let moreButton = UITabBarItem(title: moreText, image: moreImage, selectedImage: moreTappedImage)


    homeVC.tabBarItem = homeButton
    shopVC.tabBarItem = shopButton
    offersVC.tabBarItem = offersButton
    moreVC.tabBarItem = moreButton

}
Run Code Online (Sandbox Code Playgroud)

PS,您可以根据需要添加任意数量的标签,并且在滚动标签时不会遇到任何错误,

确保在标签栏控制器之前只有一个导航控制器。