我正在尝试刷新在视图控制器(View Controller 1)上使用核心数据的tableview上的数据。用于将值保存到核心数据的保存按钮(UIButton)位于不同的视图控制器(View Controller 2)上。
它们同时在iPad的同一屏幕上,但使用容器视图具有单独的类(标题和主文件)。当我单击View Controller 1上的保存按钮时,它不会刷新View Controller 2上的表视图。
但是,我知道它不是将数据保存到Core Data的方式,因为当我刷新应用程序时,新的单元格会弹出桌面视图,就像它应该的那样。我尝试了以下方法尝试让表格视图刷新而没有运气:
// ViewController1.m (Save Button)
- (IBAction)saveMethod {
//Core Data Save Method Goes Here (Irrelevant)
[self.managedObjectContext save:nil];
//ViewController2 has the table view
ViewController2 *trackingView = [[ViewController2 alloc] init];
trackingView.managedObjectContext = self.managedObjectContext;
[trackingView setupFetchedResultsController];
[trackingView.view setNeedsDisplay];
[trackingView.table reloadData];
}
我似乎无法弄清楚如何告诉此表视图从其他视图控制器刷新自己。
答案 0 :(得分:2)
您不需要像现在一样重新创建viewcontroller。
当NSManagedObjectContext
完成保存操作时,它会发布通知。您可以让任何对象注册以接收这些通知。如果重新设置fetchedResultsController
的委托不是一个选项(即ViewController1
已经设置为委托,请考虑这一点,ViewController1
继续充当委托是有意义的)。
ViewController2
将需要对正在处理数据的托管对象上下文的引用,因此您需要创建一个属性并对其进行适当设置(@property NSManagedObjectContext *moc
)。
然后,在viewDidLoad
中register for notifications:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNotification:)
name:NSManagedObjectContextDidSaveNotification
object:self.moc];
ViewController2
必须定义方法handleNotification:
:
-(void)handleNotification:(NSNotification*)notification {
if ( [notification.name isEqual:NSManagedObjectContextDidSaveNotification] && [notification.object isEqual:self.moc] ) {
[self.tableView reloadData];
}
}
关于这种方法的几点说明:
[[NSNotificationCenter defaultCenter] removeObserver:self]
。通知中心保留观察员(我发现了一次艰难的方式)。答案 1 :(得分:0)
当您的目标是针对您必须刷新的实例时,您可能不希望创建ViewController2
的新实例。事实上,您的问题出在ViewController2
,而不是此处。
确保将ViewController2
设置为其获取的结果控制器的委托,然后从获取的结果控制器委托回调中更新表视图。并确保两个视图控制器都在查看相同的托管对象上下文。