我有一个带有UITableView的UIViewController。我已将UITableView的委托和数据源设置为IB中的UIViewController以及viewDidLoad中的UIViewController。我已根据UITableView和NSFetchedResultsController的apple文档实现了所有委托方法,并且我发现在应用程序启动时,核心数据信息被加载到UITableView中。
...
[NSFetchedResultsController deleteCacheWithName:@"Stuff"];
self.tableview.delegate = self;
self.tableview.dataSource = self;
self.fetchedResultsController.delegate = self;
self.tableview.allowsSelection = NO;
self.sNavBar.delegate = self;
...
当点击UIButton时,还会出现一个模态视图。当我使用模态视图添加新项目然后关闭模态视图时,父UIViewController上的UITableView不会刷新最新数据。
如果我终止应用程序并重新启动它,那么我添加的项目将被加载到UITableView中。所以我可以看到NSFetchedResultsController正在加载我的数据但是在应用运行时没有加载新添加的数据。
我已经尝试了好几个小时才能正确连接,但我看不出问题。我也尝试删除fetchedresultscontroller缓存。
我添加了一个方法来执行fetchedresultscontroller的获取,当模态被解除时以及在UITableView上发生下拉刷新时调用它。
- (void)loadRecordsFromCoreData {
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
}
当模态视图被解除时,我调用了viewWillAppear方法,该方法应重新加载表视图,但我认为这里有一个竞争条件,当模态视图消失时,尚未添加新项目。此时会调用上面的loadRecordsFromCoreData。因此,为了测试我在UITableView中添加了刷新下拉菜单,但这也没有引入新添加的项目。
更新1:
当我在下面的代码中的模态视图中保存新项目时,我会发出通知:
- (IBAction)saveData:(id)sender {
if (![self.txtEvent.text isEqualToString:@""]) {
[self.managedObjectContext performBlockAndWait:^{
NSError *error = nil;
BOOL saved = [self.managedObjectContext save:&error];
if (!saved) {
// do some real error handling
NSLog(@"Could not save due to %@", error);
}
[[MVCoreDataController sharedInstance] saveMasterContext];
}];
[[NSNotificationCenter defaultCenter] postNotificationName:@"refresh" object:nil];
[self dismissViewControllerAnimated:YES completion:^{
[delegate modalWasDismissed:self];
}];
}
else
{
UIAlertView *cannotSaveAlert = [[UIAlertView alloc] initWithTitle:@"Uh oh..." message:@"Some Problem." delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
[cannotSaveAlert show];
}
}
这个“刷新”选择器然后在父视图控制器上调用viewWillAppear,该控制器调用loadRecordsFromCoreData和[self.tableview reloadData],但表中没有出现任何新内容。
在父视图控制器的viewWillAppear中,我有以下代码:
-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
[self loadRecordsFromCoreData];
[self.tableview reloadData];
}
我做错了什么?
答案 0 :(得分:2)
[self.tableview reloadData];
随时在reloadData
上调用tableView
方法,然后重新加载数据。
您甚至可以将tableView
传递给您正在显示的模态视图,以便可以从viewWillDisappear
或viewDidDisappear
中的模态视图刷新表格视图。