我之前已经问了这个问题,但从来没有得到一个好的答案,所以我再次问它,重新措辞,并希望问题变得更加明确:
我有一个标签栏控制器A,嵌入在导航控制器中。 第一个选项卡包含一个表视图Controller B,第二个选项卡包含一个带有核心图的视图控制器C. 导航栏有一个+ bar按钮,它以模块方式分割视图控制器D,用户在其中向核心数据添加新对象/记录。
表视图控制器D使用NSFetchedResultsController作为其数据源,因此当用户从控制器D返回时,新创建的对象将显示在表视图中。
但是,如果用户点击第二个选项卡上的+ bar按钮,并在模块化的视图控制器D中创建新的对象/记录,然后返回到第二个选项卡,则不会更新核心图表图表。我调查过,发现提供核心图数据的获取请求不会再次更新/执行。
那么,如何强制再次执行获取请求?
视图控制器D中我的'done'方法结束时的代码:
MRBMITabBarController *tabController = (MRBMITabBarController *) self.delegate;
NSArray *controllers = tabController.viewControllers;
MRBMIKurveViewController *kurveController = (MRBMIKurveViewController *) [controllers objectAtIndex:1];
kurveController.bmisForPlot = nil;
kurveController.bmisForPlot = [[kurveController fetchBmisForPlot] copy];
[kurveController.graph reloadData];
[kurveController.boundLinePlot reloadData];
[self.delegate dismissViewControllerAnimated:YES completion:nil];
但这不会刷新视图控制器C中的绘图,但是表视图控制器D中的表视图会刷新。
注意:MRBMIKurveViewController是视图控制器C。
答案 0 :(得分:0)
呼叫:
NSError *err = nil;
[managedObjectContext save:&err];
更改日期后
在控制器的viewViewAppear
方法中调用重装数据方法
答案 1 :(得分:0)
最后我找到了解决方案:
MRBMITabBarController *tabController = (MRBMITabBarController *) self.delegate;
NSArray *controllers = tabController.viewControllers;
MRBMIKurveViewController *kurveController = (MRBMIKurveViewController *) [controllers objectAtIndex:1];
kurveController.bmisForPlot = [[kurveController fetchBmisForPlot] copy];
kurveController.dataForPlot = [kurveController testData3];
[kurveController.boundLinePlot reloadData];
[self.delegate dismissViewControllerAnimated:YES completion:nil];
基本上我调用所有方法(通过委托),这些方法涉及在视图控制器D的“完成”方法内创建绘图数据,然后解除视图控制器D
答案 2 :(得分:0)
为什么不在核心绘图视图(C)上使用单独的fetchedResultsController
,并将其用作绘图的数据源。不确定情节如何工作,因此您可能需要在其上调用reloadData
。您可能只需要实现一个fetchedResultsController委托方法controllerDidChangeContent
来调用'reloadData'。
这样你的观点完全相互独立,甚至不需要知道另一个观点是否存在。你的方式D必须知道C的私密细节。现在你可以有一个后台线程来更新数据,你的情节会更新。