Passing data from view controller to tab bar controller in iOS

可紊 提交于 2020-01-22 12:15:14

问题


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!


回答1:


Here's my setup that worked:

  1. Setup Segue:
    1. Setup View Controller with segue to Tab Bar Controller with 2 child View Controllers in Storyboard
    2. Specify segue identifier (tab)
  2. Setup Classes in Storyboard:
    1. View Controller class = ViewController
    2. Tab Bar Controller class = TabBarController
    3. Tab Bar Controller Child View Controller class = TabsViewController (shared between both)
  3. Setup labelString property in Tab Bar Controller:

    1. In TabBarController.h:

      @property (nonatomic, strong) NSString *labelString;
      
    2. In TabBarController.m:

      @synthesize labelString;
      
  4. 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"]];
        }
    }
    
  5. Setup UILabels for Child Tab Bar View Controllers.

    1. Drag default UILabel controls into both child View Controllers
    2. Create property in TabsViewController.h:

      @property (nonatomic, strong) IBOutlet UILabel *label;
      
    3. Hook 5.1 and 5.2 up in Storyboard

  6. 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.




回答2:


If your hierarchy is Viewcontroller->UItabbarcontroller->ViewCOntroller

in my case i have to send data to marketviewcontroller . In tabcontroller, marketviewcontroller is present at index 0.

  - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
 if ([[segue identifier] isEqualToString:@"tab"])
  {
    UITabBarController *tabar=segue.destinationViewController;
    MarketViewController *marketViewcontroller=[tabar.viewControllers objectAtIndex:0];

   // pass data to market view controller
    [marketViewcontroller passobject:Yourdata];
 //   or 
  marketViewcontroller.value=Yourdata
  } 
  }  

in MarketViewController.h 
 @property(nonatomic,retain) NSString * value;



回答3:


How are you showing your TabBarViewController from your UIViewController?

I am guessing with a segue. If this is the way you're doing it, you can pass data to this UITabBarController which is the "parent" for all the controllers inside the tabs.

Say you want to pass a string to the UITabBarController, you would define a property in this controller and set it before the segue.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
      if ([[segue identifier] isEqualToString:@"tab"])
      {
          UITabBarController *tabBarVC=segue.destinationViewController;
          tabBarVC.stringToSet = @"hi";
      }
  }

Then, with the delegate method, you have the selected view controller, so you can pass the parent property to the children:

- (void)tabBarController:(UITabBarController *)theTabBarController didSelectViewController:(UIViewController *)viewController {
    viewController.stringToSet = self.stringToSet // self is UITabBarController
}



回答4:


Have a look at singletons. Inside a tab you create an instance of a helper class which implements the singleton template, ensuring that there is actually only one single instance. Which means when the second tab instantiates the same helper class it will have access to the same object, which you can use to share your data ...

e.g.: http://www.galloway.me.uk/tutorials/singleton-classes/




回答5:


First thing:

1- You want to pass the data to your tab for some reason...

or:

2- You want to pass the data to your tab so then you can pass to another UIViewController?

If it's the second option, the most common pattern for that is the Singleton. Where you can keep common data, that can be used/reused by different parts of the application.




回答6:


The easiest way is create a custom class and set the value from controller to custom class and then get the value from custom class to the controller.

Sample code is here:

First create custom class for example

AppUtility.h

+(void)setXxxName:(NSString *)str;
+(NSString *)getXxxName;

AppUtility.m

static NSString *xxxname;

+(void)setXxxName:(NSString *)str{

   xxxname=str;
 }

+(NSString *)getXxxName{

  return xxxname;
 } 

FirstController.m

import the custom class in the controller

#import "AppUtility.h"

set the value from first controller to custom class, use the below code to set the value:

[AppUtility setXxxName:@"xyz"];

Second controller.m

import the custom class in the controller

#import "AppUtility.h"

here get the value from the custom class, use the below code to get the value:

NSString *str = [AppUtility getXxxName];

In appUtility class Use nslog statements to verify the values are correct or not



来源:https://stackoverflow.com/questions/17743107/passing-data-from-view-controller-to-tab-bar-controller-in-ios

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!