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!