将数据从视图控制器传递到iOS中的标签栏控制器

时间:2013-07-19 09:51:02

标签: ios objective-c storyboard viewcontroller tabbarcontroller

我正在开发一款iOS应用,现在我很茫然。我正在尝试将数据从第一个View Controller传递到TabBarViewController的第一个选项卡(使用storyboard)。我发现了很多教程,解释了如何在视图控制器之间传递数据,但是我的标签栏没有任何效果。我知道标签栏控制器包含一种视图数组。视图控制器和标签栏控制器之间的关系使用segue(推送)实现。所以,我认为使用prepareForSegue()方法很容易。像那样:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
 if ([[segue identifier] isEqualToString:@"tab"]) {

 // ...

    } 
 }  

不幸的是,标签栏控制器和每个标签栏视图之间的关系并不真实。这只是一种“关系”。这意味着,我没有能够用于上述方法的segue标识符。在这种情况下是否有可能使用prepareForSegue?如果没有,任何想法如何解决这个问题?我知道有一个类似的问题,但答案并没有那么有用。我是否必须为标签栏控制器中的每个选项卡(视图)创建新文件?或者是否可以为整个标签栏控制器设置一个类(m。& h。),使用objectAtIndex()访问多个视图?

提前致谢!

6 个答案:

答案 0 :(得分:8)

如果您的层次结构是Viewcontroller-> UItabbarcontroller-> ViewCOntroller

在我的情况下,我必须将数据发送到marketviewcontroller。在tabcontroller中,marketviewcontroller出现在索引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;

答案 1 :(得分:8)

这是我的设置:

  1. 设置Segue:
    1. 使用segue到标签栏控制器设置视图控制器,并在故事板中使用2个子视图控制器
    2. 指定segue标识符(tab
  2. 在Storyboard中设置类:
    1. 查看控制器类= ViewController
    2. 标签栏控制器类= TabBarController
    3. 标签栏控制器子视图控制器类= TabsViewController(两者共享)
  3. 在标签栏控制器中设置labelString属性:

    1. TabBarController.h

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

      @synthesize labelString;
      
  4. prepareForSegue中的设置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. 为子标签栏视图控制器设置UILabel s。

    1. 将默认UILabel控件拖到两个子视图控制器
    2. TabsViewController.h中创建属性:

      @property (nonatomic, strong) IBOutlet UILabel *label;
      
    3. 在故事板中挂起5.15.2

  6. ViewDidLoad中的设置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];
    }
    
  7. 现在点击第一个和第二个标签将分别显示标签Tab 0: This has been setTab 1: This has been set

答案 2 :(得分:1)

你如何从你的UIViewController展示你的TabBarViewController?

我猜着一个赛格。如果这是你正在做的方式,你可以将数据传递给这个UITabBarController,它是标签内所有控制器的“父”。

假设您要将字符串传递给UITabBarController,您可以在此控制器中定义一个属性并在segue之前设置它。

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

然后,使用委托方法,您拥有所选的视图控制器,因此您可以将父属性传递给子项:

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

答案 3 :(得分:1)

看看单身人士。在选项卡内部,您可以创建一个实现单例模板的辅助类实例,确保实际上只有一个实例。这意味着当第二个选项卡实例化同一帮助程序类时,它将可以访问同一个对象,您可以使用它来共享您的数据......

例如:http://www.galloway.me.uk/tutorials/singleton-classes/

答案 4 :(得分:0)

第一件事:

1-您想出于某种原因将数据传递到标签页......

或:

2-您想将数据传递到标签,然后您可以转到另一个UIViewController吗?

如果是第二种选择,最常见的模式是Singleton。您可以保存公共数据的位置,可以由应用程序的不同部分使用/重用。

答案 5 :(得分:0)

最简单的方法是创建一个自定义类,并将值从控制器设置为自定义类,然后从自定义类中获取值到控制器。

示例代码在这里:

首先创建自定义类,例如

<强> 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 "AppUtility.h"

将值从第一个控制器设置为自定义类,使用以下代码设置值:

[AppUtility setXxxName:@"xyz"];

Second controller.m

导入控制器中的自定义类

#import "AppUtility.h"

这里从自定义类中获取值,使用下面的代码获取值:

NSString *str = [AppUtility getXxxName];

在appUtility类中使用nslog语句验证值是否正确