将数据从2个视图控制器发送到一个视图控制器

时间:2014-01-09 00:08:06

标签: ios objective-c

我正在编写一个Calorie Tracker应用程序,其中我有3个视图控制器。它们都连接到故事板中的标签栏控制器。

  • 饮食视图控制器
  • 练习视图控制器
  • 主视图控制器

基本上我想做的是从我的运动视图控制器和我的饮食视图控制器中获取数据并将其显示在我的主视图控制器上。这是我的HomeViewController.m

中viewDidLoad的代码
    //Referencing both view controllers
MainViewController *mainViewController = [[MainViewController alloc] init];
ExerciseViewController *exerciseViewController = [[ExerciseViewController alloc] init];

//Doing the math
int totalCalsConsumed = mainViewController.totalLabel.text.intValue;
int totalCalsBurned = exerciseViewController.totalCalsBurned.text.intValue;
int totalAmountOfCalories = totalCalsConsumed - totalCalsBurned;

//display the data
NSString *totalAmtCalsText = [NSString stringWithFormat:@"%i", totalAmountOfCalories];
totalAmtOfCals.text = totalAmtCalsText;

另外,我无法使用segue传递任何数据,因为我的所有视图控制器都连接到标签栏,并且标签栏没有prepareForSegue方法。

所有的帮助表示赞赏,我也想知道我是否已经过度使用Core Date来解决这个难题。现在我正试图躲避Core Date,因为它是一个非常高级的话题,我将来会谈到它,但如果我必须使用Core Data这个应用程序,我会想出一些东西。

3 个答案:

答案 0 :(得分:1)

由于你强烈希望避免核心数据 - 我觉得应该考虑这一点 - 我可以提供一个快速的,可能是脏的(可能不是)解决方案,以便你可以通过viewControllers访问数据。

根据你正在做的事情,好像你想要从tabbar视图控制器访问数据。

这样做的一种方法是将数据模型放在一个地方,其他视图控制器可以访问它。就像具有web服务的服务器或具有将数据保存在一个地方的单例一样。

在您的情况下,您需要一个快速解决方案,您现在可以执行此操作,只要所提到的所有ViewControllers都在您的tabBar中

//Create variables
int totalCalsConsumed;
int totalCalsBurned;
int totalAmountOfCalories;

//All your view controllers are accessible from your tabBar like so
NSArray *myViewControllers = self.tabBarController.viewControllers;

//We iterate through the view controllers in the tabBar
for(int i = 0; i < [myViewControllers count]; i++){
    //This is the current view controller in the for loop execution
    id currentVC = [myViewControllers objectAtIndex:i];

    //Check if the currentVC variable is of type MainViewController
    if([currentVC isKindOfClass:[MainViewController class]]{
        //lets access the totalLabel property and store in variable
        totalCalsConsumed = ((MainViewController *)currentVC).totalLabel.text.intValue;
    }
    //Check if the currentVC variable is of type ExerciseViewController
    else if([currentVC isKindOfClass:[ExerciseViewController class]]){
        //if so lets now access the totalCalsBurned property and store in variable
        totalCalsBurned = ((ExerciseViewController *)currentVC).totalCalsBurned.text.intValue;
    }
}

//Doing the math
totalAmountOfCalories = totalCalsConsumed - totalCalsBurned;

//display the data
NSString *totalAmtCalsText = [NSString stringWithFormat:@"%d", totalAmountOfCalories];
totalAmtOfCals.text = totalAmtCalsText;

我没有测试过这个,因为我现在刚刚写了这个,但从开始就应该是好的。代码评论是为了解你的最新情况。很直接。

自从你开发健身应用程序以来你的配对 在将来,我建议更持久的东西,如果应用程序已经退出,数据不会丢失,特别是因为你正在创建一个健身应用程序。我目前正在个人的时间使用BodyBuilding健身应用程序,并且在我的工作期间丢失数据时遇到了挫折(设置信息,每个集合的总代表完成的练习)只是因为开发人员从不打算存储我的数据在我锻炼的某个地方,以防我的电池耗尽。

答案 1 :(得分:0)

您可以选择以下几种方法之一:

  1. 您可以创建Singleton并存储/读取此singleton中的所有持久数据。不过应该谨慎使用单身人士。
  2. 只要某些值发生变化,您就可以使用NSNotificationCenter发送NSNotificationsUIViewControllers可以注册接收NSNotifications
  3. 您可以使用CoreData或其他技术(例如NSUserDefaultsNSKeyedArchiver / NSKeyedUnarchiver)在文件系统上存储持久数据。
  4. 也许也可以使用依赖注入方法。在应用delegate中创建对象并将其传递给所有相关的UIViewControllers。使用此对象的方式与使用我在选项1中提到的singleton相同。
  5. 目前可能还有更多我不记得的选择。

答案 2 :(得分:0)

键值编码,NSNotificationCentre和Delegates是首选。但NSNotificationCentre对您来说最简单。

UIViewController Home View Controller必须添加如下观察者:Init:

  

[[NSNotificationCenter defaultCenter] addObserver:self   selector:@selector(methodToUpdate :) name:@“UPDATE_ME”对象:(id)anyObject];

在delloc方法中:

  

[[NSNotificationCenter defaultCenter] removeObserver:self];

从其他2个类中发布它,就像任何UIButton操作一样:

  

[[NSNotificationCenter defaultCenter] postNotificationName:@“UPDATE_ME”对象:(id)anyObject];

NSNotificationCentre的优势在于他们可以在多个类中添加观察者。