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

问题描述:

我试图刷新在视图控制器(视图控制器1)上使用核心数据的tableview上的数据。用于将值保存到核心数据中的保存按钮(UIButton)位于不同的视图控制器(视图控制器2)上。从另一个类重新加载核心数据表视图

他们都在同一时间对iPad在同一屏幕上,但有单独的类(头和主文件)通过集装箱意见。当我点击视图控制器1上的保存按钮时,它不刷新视图控制器2上的表格视图。

但是,我知道这不是它将数据保存到核心数据的方式,因为当我刷新应用程序时,新的单元格就像它应该的那样在表格视图中弹出。我曾尝试以下方法来尝试并获得表视图,没有运气刷新:

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

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

你并不需要重新创建视图控制器,你现在做的事情。

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:

  1. 当你:

    -(void)handleNotification:(NSNotification*)notification { 
        if ([notification.name isEqual:NSManagedObjectContextDidSaveNotification] && [notification.object isEqual:self.moc]) { 
         [self.tableView reloadData]; 
        } 
    } 
    

    对这种做法有几个注意事项视图控制器已被解雇,请务必致电[[NSNotificationCenter defaultCenter] removeObserver:self]。通知中心保留观察员(我发现困难一次)。

  2. 注册通知时始终包含托管对象上下文,您不希望响应每个保存通知。
+0

我尝试了以下方法。似乎它应该工作,但它没有。如果在View Controller 2中我需要创建另一个属性我已经有一个managedObjectContext属性?因为我通过添加而不是“self.moc”来尝试它,所以我做了“self.managedObjectContext”,但这不起作用 – Zack 2013-03-17 16:45:40

+0

您不应该需要创建另一个属性,并且实际的命名无关紧要。只要两个视图控制器中的'managedObjectContext'指向同一个对象。 – 2013-03-17 16:52:56

+0

是的,这就是我的想法。两个managedObjectContext都指向App Delegate – Zack 2013-03-17 19:21:20

你可能不希望在你的目标是你已经刷新实例来创建的ViewController2一个新的实例。事实上,你的问题在ViewController2,不在这里。

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

+0

你能解释一下我怎样通过设置它作为一个代表来使用它吗? – Zack 2013-03-17 02:04:15

+0

您是否阅读过“NSFetchedResultsControllerDelegate”的文档?在你获得的回调和'UITableView'上的更新方法之间几乎有一对一的映射关系。 – 2013-03-17 02:13:40