从另一个类重新加载核心数据表视图
我试图刷新在视图控制器(视图控制器1)上使用核心数据的tableview上的数据。用于将值保存到核心数据中的保存按钮(UIButton)位于不同的视图控制器(视图控制器2)上。从另一个类重新加载核心数据表视图
他们都在同一时间对iPad在同一屏幕上,但有单独的类(头和主文件)通过集装箱意见。当我点击视图控制器1上的保存按钮时,它不刷新视图控制器2上的表格视图。
但是,我知道这不是它将数据保存到核心数据的方式,因为当我刷新应用程序时,新的单元格就像它应该的那样在表格视图中弹出。我曾尝试以下方法来尝试并获得表视图,没有运气刷新:
// 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];
}
我似乎无法弄清楚如何讲这个表视图,从不同的视图控制器自动刷新。
你并不需要重新创建视图控制器,你现在做的事情。
当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]
。通知中心保留观察员(我发现困难一次)。 - 注册通知时始终包含托管对象上下文,您不希望响应每个保存通知。
你可能不希望在你的目标是你已经刷新实例来创建的ViewController2
一个新的实例。事实上,你的问题在ViewController2
,不在这里。
确保ViewController2
设置为其获取结果控制器的委托,然后从获取的结果控制器委托回调中更新您的表视图。并确保两个视图控制器都在查看相同的托管对象上下文。
你能解释一下我怎样通过设置它作为一个代表来使用它吗? – Zack 2013-03-17 02:04:15
您是否阅读过“NSFetchedResultsControllerDelegate”的文档?在你获得的回调和'UITableView'上的更新方法之间几乎有一对一的映射关系。 – 2013-03-17 02:13:40
我尝试了以下方法。似乎它应该工作,但它没有。如果在View Controller 2中我需要创建另一个属性我已经有一个managedObjectContext属性?因为我通过添加而不是“self.moc”来尝试它,所以我做了“self.managedObjectContext”,但这不起作用 – Zack 2013-03-17 16:45:40
您不应该需要创建另一个属性,并且实际的命名无关紧要。只要两个视图控制器中的'managedObjectContext'指向同一个对象。 – 2013-03-17 16:52:56
是的,这就是我的想法。两个managedObjectContext都指向App Delegate – Zack 2013-03-17 19:21:20