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

我正在开发一个iOS应用程序,现在我不知所措。 我试图将数据从第一个视图控制器传递到TabBarViewController的第一个选项卡(使用故事板)。 我发现很多教程解释如何在视图控制器之间传递数据,但没有任何工作与我的标签栏。 我知道标签栏控制器包含一种视图数组。 视图控制器和标签栏控制器之间的关系是通过一个segue(push)来实现的。 所以,我认为使用prepareForSegue()方法很容易。 像那样:

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

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

提前致谢!

这是我的设置工作:

  1. 设置Segue:
    1. 在Storyboard中设置具有两个子视图控制器的选项卡控制器
    2. 指定segue标识符( tab
  2. 故事板中的设置类:
    1. 视图控制器类= ViewController
    2. 标签栏控制器类= TabBarController
    3. 标签栏控制器子视图控制器类= TabsViewController (在两者之间共享)
  3. 在标签栏控制器中设置labelString属性:

    1. TabBarController.h

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

       @synthesize labelString; 
  4. ViewController.m设置prepareForSegue方法:

     #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

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

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

  6. TabsViewController.m设置ViewDidLoad方法:

     #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]; } 

现在点击第一个和第二个标签将会有标签显示Tab 0: This has been set并且Tab 1: This has been set分别Tab 1: This has been set

如果您的层次结构是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; 

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

我在用segue猜测。 如果这样做的话,你可以将数据传递给这个UITabBarController,它是标签内所有控制器的“父”。

假设你想传递一个string给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 } 

看看单身。 在选项卡中,创build一个实现单例模板的helper类的实例,确保实际上只有一个实例。 这意味着当第二个标签实例化相同的帮助类,它将有权访问相同的对象,你可以用它来共享你的数据…

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

第一件事:

1-由于某种原因,您想将数据传递给您的标签。

要么:

2-你想传递数据到你的标签,那么你可以传递给另一个UIViewController

如果是第二种select,最常见的模式就是Singleton。 在哪里可以保存常用数据,这些数据可以被应用程序的不同部分使用/重用。

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

示例代码在这里:

首先创build自定义类,例如

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"]; 

第二个controller.m

在控制器中导入自定义类

 #import "AppUtility.h" 

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

 NSString *str = [AppUtility getXxxName]; 

在appUtility类中使用nslog语句来validation值是否正确