我正在编写一个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这个应用程序,我会想出一些东西。
答案 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)
您可以选择以下几种方法之一:
Singleton
并存储/读取此singleton
中的所有持久数据。不过应该谨慎使用单身人士。NSNotificationCenter
发送NSNotifications
。 UIViewControllers
可以注册接收NSNotifications
。CoreData
或其他技术(例如NSUserDefaults
或NSKeyedArchiver
/ NSKeyedUnarchiver
)在文件系统上存储持久数据。delegate
中创建对象并将其传递给所有相关的UIViewControllers
。使用此对象的方式与使用我在选项1中提到的singleton
相同。目前可能还有更多我不记得的选择。
答案 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的优势在于他们可以在多个类中添加观察者。