Search code examples
swiftfirebaseuinavigationcontrolleruitabbarcontrolleruistoryboardsegue

Passing data from a tab bar switch right into another view controller


The question might sound complicated, so let me ease the stress*

  • Lets say I have 2 tab bar tabs (Home1, Home2)

  • Both (Home1, Home2) have navigational controllers with two view controllers each

  • Home1(Navigation controller -> VC11 -> VC12)

  • Home2 (Navigation controller -> VC21 -> VC22)

Easy right? Well, not quite

What I want to do is pass data from [Home1: VC12 to Home2: VC22].

My coding efforts:

tabBarController!.selectedIndex = 1
self.navigationController!.popToViewController(navigationCon‌troller!.viewControl‌​lers[1] as! (Home2: VC22), animated: false)



let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
navController.popToViewController((Home2: VC22) as! UIViewController, animated: true)

for oneView in (self.navigationController?.viewControllers)! {
    if (oneView.isKind(of: (Home2: VC22).classForCoder())) {
      let friendView = oneView as! (Home2: VC22)
      friendView.testing = "Worked?"
    }
}

ANYHELP IS WELCOMED!! Total hours spent: 8hrs


Solution

  • Your pass data task is going though this process

    V12 --(pop)--> V11 --(switch)--> V21 --(push)--> V22

    If you choose to pass data, you will need to pass it though all these three transactions and that's lots of coding and it's hard to practice.

    Instead of passing data around, a better way to accomplish your goal is to store the data in V12, and then load it from V22. So now all you need to worry about is how to transfer user from V12 to V22.

    You only need two lines of code to store and read data from UserDefaults

    On your V12, before you are doing the above transactions, first save your data like this

    UserDefaults.standard.set("yourStringData", forKey: "data")
    

    Then when you reach VC22, from viewDidLoad, read stored info in this way

    UserDefaults.standard.string(forKey: "data")
    

    For your view transaction part, popToViewController is for going from a child view controller to it's parent. So when you switch your tab and get the UINavigationController, the topViewController must be VC21. So to go to VC22 given that you connect them though a storyboard segue, simply call it like this

    let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
    let VC21 = navController.topViewController!
    VC21.performSegue(withIdentifier: "segue", sender: nil)