Passing data from view controller to tab bar controller in iOS

ios, objective-c, storyboard, tabbarcontroller, viewcontroller

Solution

Here's my setup that worked:

- Setup Segue:

- Setup View Controller with segue to Tab Bar Controller with 2 child View Controllers in Storyboard

- Specify segue identifier (`tab`)

- Setup Classes in Storyboard:

- View Controller class = `ViewController`

- Tab Bar Controller class = `TabBarController`

- Tab Bar Controller Child View Controller class = `TabsViewController` (shared between both)

Setup `labelString` property in Tab Bar Controller:

In `TabBarController.h`:

@property (nonatomic, strong) NSString *labelString;

In `TabBarController.m`:

@synthesize labelString;

Setup `prepareForSegue` method in `ViewController.m`:

#import "TabBarController.h"

...

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier] isEqualToString:@"tab"]){
        TabBarController *tabBar = [segue destinationViewController];
        [tabBar setLabelString:[NSString stringWithFormat:@"This has been set"]];
    }
}

Setup `UILabel`s for Child Tab Bar View Controllers.

- Drag default `UILabel` controls into both child View Controllers

Create property in `TabsViewController.h`:

@property (nonatomic, strong) IBOutlet UILabel *label;

Hook `5.1` and `5.2` up in Storyboard

Setup `ViewDidLoad` method in `TabsViewController.m`:

#import "TabBarController.h"

...

@synthesize label;

...

- (void)viewDidLoad
{
    [super viewDidLoad];

    TabBarController *tabBar = (TabBarController *)self.tabBarController;
    label.text = [NSString stringWithFormat:@"Tab %i: %@",[tabBar.viewControllers indexOfObject:self],tabBar.labelString];
}

Now clicking on the 1st and 2nd tabs will have the labels display `Tab 0: This has been set` and `Tab 1: This has been set`, respectively.

Problem

I'm developing an iOS app and now I'm at a loss. I'm trying to pass data from the first View Controller to the first tab of a TabBarViewController (with using the storyboard). I found a lot of tutorials that explain how to pass data between view controllers, but nothing worked with my tab bar. I know that the tab bar controller contains a kind of array of views. The relation between the View Controller and the Tab Bar Controller is realized using a segue (push). So, I thought it is easy to use the prepareForSegue() - method. Like that: ``` - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if ([[segue identifier] isEqualToString:@"tab"]) { // ... } } ``` Unfortunately, the relation between the Tab Bar Controller and each tab bar view is no real segue. It's only a "relationship". That means, there is no segue identifier I am able to use for the the method above-mentioned. Is there a possibility to use the prepareForSegue in this case? If not, any ideas how to solve this problem? I know that there is a similar question, but the answer wasn't that helpful. Do I have to create a new file for every tab (view) within the tab bar controller? Or is it possible to have one class (m. & h.) for the whole tab bar controller, accessing the several view with objectAtIndex()? Thanks in advance!

Original source