2

我正在尝试刷新使用视图控制器(视图控制器 1)上的核心数据的表视图上的数据。用于将值保存到核心数据中的保存按钮 (UIButton) 位于不同的视图控制器 (View Controller 2) 上。

它们同时在 iPad 上的同一屏幕上,但通过使用容器视图具有单独的类(头文件和主文件)。当我单击视图控制器 1 上的保存按钮时,它不会刷新视图控制器 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];
} 

我似乎无法弄清楚如何告诉这个表视图从不同的视图控制器刷新自己。

4

2 回答 2

2

您不需要像现在这样重新创建视图控制器。

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

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

然后,viewDidLoad它可以注册通知

[[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. Always include the managed object context when registering for notifications, you don't want be responding to every save notification.
于 2013-03-17T02:13:33.757 回答
0

ViewController2当您的目标是您已经必须刷新的实例时,您可能不想创建一个新实例。事实上,你的问题是在ViewController2,而不是在这里。

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

于 2013-03-17T02:02:20.607 回答