Pass Data Between Two View Controllers Using a Custom Tab Bar Controller Class

ios, swift, uitabbarcontroller, viewcontroller, xcode

Solution

Your tab bar controller already has an instance of SecondViewController, so you shouldn't be instantiating a new one. Use the tab bar controller's viewControllers property to access the one you want (presumably, from the name, the one at index 1).

class ViewController: UIViewController {

    var log = [String]()

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        println(log)
    }
}

In the tab bar controller,

class RDTabBarController: UITabBarController , UITabBarControllerDelegate{

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) {
        var logView = self.viewControllers![1] as ViewController
        logView.log.append("Testing 123")
    }

}

Problem

I am attempting to pass data from one viewcontroller to another using a Tab Bar Controller. I have implemented a custom Tab Bar Controller class. Here is my code for this class: ``` class CustomTabBarControllerClass: UITabBarController, UITabBarControllerDelegate { override func awakeFromNib() { self.delegate = self; } func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { var logView = SecondViewController() logView.log.append("Testing 123") } } ``` As you can see in my code, I am creating an instance of `SecondViewController` with the `logView` variable. In my `SecondViewController` class, I have a `log` array setup that will hold the value being passed from my `CustomTabBarControllerClass` class. Here is my code for my `SecondViewController`. ``` class SecondViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { var log = [String]() func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return log!.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("logCell", forIndexPath: indexPath) as UITableViewCell cell.textLabel.text = log![indexPath.row] return cell } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. println(log!) //fatal error: unexpectedly found nil while unwrapping an Optional value } } ``` In my `viewDidLoad()` function, I am attempting to print the log to the console with `println(log!)`. When this code runs, I am presented with following error: `fatal error: unexpectedly found nil while unwrapping an Optional value`. So how would I go about passing data between the two viewcontrollers? Update The `didSelectViewController` function has been updated with the code below, however, I am still receiving the same error message. ``` func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { var logView = self.viewControllers![0] as SecondViewController logView.log?.append("Testing 123") } ```

Original source