我正在尝试刷新在 View Controller ( View Controller 1)上使用核心数据的 TableView 上的数据。用于将值保存到核心数据中的保存按钮 (UIButton) 位于不同的 View Controller (View Controller 2) 上。
它们同时位于 iPad 上的同一屏幕上,但通过使用容器 View 具有单独的类(头文件和主文件)。当我单击 View Controller 1 上的保存按钮时,它不会刷新 View Controller 2 上的 TableView 。
但是,我知道这不是将数据保存到 Core Data 中的方式,因为当我刷新应用程序时,新单元格会像预期的那样在 TableView 上弹出。我尝试了以下方法来尝试刷新 TableView ,但没有成功:
// 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];
}
我似乎无法弄清楚如何告诉这个 TableView 从不同的 View Controller 刷新自身。
最佳答案
您不需要像现在一样重新创建 View Controller 。
当 NSManagedObjectContext
完成保存操作后,它会发布一条通知。您可以让任何对象注册来接收这些通知。如果重新设置 fetchedResultsController
的委托(delegate),请考虑这一点不会是一个选项(即 ViewController1
已设置为委托(delegate),并且 ViewController1
继续充当委托(delegate)是有意义的)。
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];
}
}
关于此方法的一些注意事项:
- 当您查看 Controller 已被解除时,请务必调用
[[NSNotificationCenter defaultCenter] removeObserver:self]
。通知中心保留观察者(我曾经很难发现)。 - 注册通知时始终包含托管对象上下文,您不希望响应每个保存通知。
关于ios - 从另一个类重新加载核心数据 TableView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15456717/