从另一个类重新加载核心数据表视图

时间:2013-03-17 01:41:39

标签: ios objective-c xcode uitableview core-data

我正在尝试刷新在视图控制器(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];
} 

我似乎无法弄清楚如何告诉此表视图从其他视图控制器刷新自己。

2 个答案:

答案 0 :(得分:2)

您不需要像现在一样重新创建viewcontroller。

NSManagedObjectContext完成保存操作时,它会发布通知。您可以让任何对象注册以接收这些通知。如果重新设置fetchedResultsController的委托不是一个选项(即ViewController1已经设置为委托,请考虑这一点,ViewController1继续充当委托是有意义的)。

ViewController2将需要对正在处理数据的托管对象上下文的引用,因此您需要创建一个属性并对其进行适当设置(@property NSManagedObjectContext *moc)。

然后,在viewDidLoadregister 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];
    }
}

关于这种方法的几点说明:

  1. 当您查看控制器已被解除时,请务必致电[[NSNotificationCenter defaultCenter] removeObserver:self]。通知中心保留观察员(我发现了一次艰难的方式)。
  2. 注册通知时始终包含托管对象上下文,您不希望响应每个保存通知。

答案 1 :(得分:0)

当您的目标是针对您必须刷新的实例时,您可能不希望创建ViewController2的新实例。事实上,您的问题出在ViewController2,而不是此处。

确保将ViewController2设置为其获取的结果控制器的委托,然后从获取的结果控制器委托回调中更新表视图。并确保两个视图控制器都在查看相同的托管对象上下文。