【问题标题】:Reloading Core Data Table View From Another Class从另一个类重新加载核心数据表视图
【发布时间】:2013-03-05 14:27:45
【问题描述】:

我正在尝试刷新使用视图控制器(视图控制器 1)上的核心数据的表视图上的数据。用于将值保存到核心数据中的保存按钮 (UIButton) 位于不同的视图控制器(视图控制器 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];
} 

我似乎不知道如何告诉这个表视图从不同的视图控制器刷新自己。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 您能否通过将其设置为委托来向我解释如何使用它?
    • 您是否阅读了NSFetchedResultsControllerDelegate 的文档?您获得的回调与UITableView 上的更新方法之间几乎存在一对一的映射关系。
    【解决方案2】:

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

    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];
        }
    }
    

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

    1. 当您的视图控制器被关闭时,请确保调用[[NSNotificationCenter defaultCenter] removeObserver:self]。通知中心保留观察员(我发现了一次困难的方法)。
    2. 在注册通知时始终包含托管对象上下文,您不想响应每个保存通知。

    【讨论】:

    • 我在上面尝试了以下方法。似乎它应该工作,但它没有。如果在 View Controller 2 中我已经有一个 managedObjectContext 属性,我是否需要创建另一个属性?因为我通过添加而不是“self.moc”来尝试它,所以我做了“self.managedObjectContext”,但没有奏效
    • 您不需要创建另一个属性,实际命名并不重要。只要两个视图控制器中的managedObjectContext 指向同一个对象。
    • 是的,我就是这么想的。两个 managedObjectContext 都指向 App Delegate
    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多