使用NSFetchedResultsController时,UITableView不显示最新数据

时间:2013-12-15 22:35:27

标签: uitableview uiviewcontroller ios7 nsfetchedresultscontroller

我有一个带有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];
}

我做错了什么?

1 个答案:

答案 0 :(得分:2)

[self.tableview reloadData];

随时在reloadData上调用tableView方法,然后重新加载数据。

您甚至可以将tableView传递给您正在显示的模态视图,以便可以从viewWillDisappearviewDidDisappear中的模态视图刷新表格视图。