How to show different ViewControllers when tapping on tabBar in swift

I have three viewControllers and two of them connected to a tabBarController. So app should show one of the two vc’s depending Bool value when tapping on tabBar item here is my storyboard

import UIKit

class TabBarController: UITabBarController, UITabBarControllerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
      
        
    }
    
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        let userLoggedIn: Bool!
        if tabBarController.selectedIndex == 1{
            if userLoggedIn == true{
                // show firstVC
            }else{
                // show secondVC
            }
        }
    }
}

Upvotes: 2

Views: 1719

Answers (3)

Ptit Xav
Ptit Xav

Reputation: 3219

Simply set the viewController list when the userLoggedIn variable is modified (assuming userLoggedIn is TabBarCOntroller instance variable) :

class TabBarC: UITabBarController {

    @IBOutlet var firstVC : FirstViewController!
    @IBOutlet var secondVC : SecondViewController!
    @IBOutlet var thirdVC : ThirdViewController!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        for vc in self.viewControllers! {
            if let fv = vc as? FirstViewController {
                firstVC = fv
            } else if let fv = vc as? SecondViewController  {
                secondVC = fv
            } else if let fv = vc as? ThirdViewController  {
                thirdVC = fv
            }
        }
    }


    var userLoggedIn : Bool = false {
        didSet {
        if userLoggedIn {
            self.viewControllers = [firstVC, thirdVC]
        } else {
            self.viewControllers = [secondVC, thirdVC]
        }
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self. userLoggedIn = false
    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
        if item.tag == 3 { // For purpose of test i set tag for 3 VC to 1 for firsttVC, 2 for secondVC, 3 for thirdVC
            // for test : change login value each time thirdVC is selected
            userLoggedIn = ! userLoggedIn
        }
    }

So each time from anywhere in your code you setup userLoggedIn, the tabor show the wanted tab bar items. The 3 VC are added to the tabbar in the stpryboard. When selecting thirdVC, the first tab bar item changes between one and two

Upvotes: 0

Simply add .overCurrentContext to modalPresentationStyle in your viewDidLoad like this.

 let newVC = self.storyboard?.instantiateViewController(withIdentifier:"secondVC")
 newVC?.modalPresentationStyle = .overCurrentContext
 self.present(newVC!, animated: false, completion: nil)

Upvotes: 0

vien vu
vien vu

Reputation: 4337

You can use childViewController with the parent is ViewController fromStoryboard.

   override func viewDidLoad() {
        super.viewDidLoad()
        
       ///add two ChildVC here, hide 1 ifneeded
    }

When click to this tab you check userLoggedIn.

   override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        if userLoggedIn == true {
               /// show first childVC
               /// hide second childVC
         } else {
                /// hide first childVC
               /// show second childVC
         }
    }

You can check demo: Demo

Upvotes: 1

Related Questions