如何更新托管对象数据?

How to update managed object data?

我已经启动了我的第一个核心数据应用程序。我现在正在与一个名为 'Folder'.

的实体合作

第一个视图控制器在 table 视图中显示所有文件夹,我可以向其中添加并重新加载数据。这工作正常,因为它使用获取请求来填充 table。

override func viewWillAppear(animated: Bool) {
    var error: NSError?
    let request = NSFetchRequest(entityName: "Folder")
    request.sortDescriptors = [NSSortDescriptor(key: "date", ascending: true)]

    self.events = moc?.executeFetchRequest(request, error: &error) as! [Folder]        

    self.UITable.reloadData()

 }

然而,当通过 table 单元格转到另一个视图控制器时,我使用索引路径将选定的文件夹数据传递给控制器​​。例如

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "showDetails" {
        let destinationVC = segue.destinationViewController as! FolderDetailsViewController
        let indexPath = UITable.indexPathForSelectedRow()
        let selectedFolder = folders[indexPath!.row]
        destinationVC.selectedFolder = selectedFolder        
    }
 }

我的第二个视图控制器使用从第一个 table 视图传递的数据显示在文本字段中:

var selectedFolder: Folder!
folderNameLabel.text = selectedFolder?.title
folderDetailsLabel.text = selectedFolder?.details
folderDateLabel.text = displayDate

然后我有一个模态 edit/save 从第二个控制器出现的模态中的文件夹数据:

//Edit and save event

   let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
            //Error
            var error: NSError?

            //Storing Data from fields
            SelectedFolder!.title = FolderName.text
            SelectedFolder!.details = FolderDetails.text
            SelectedFolder!.date = FolderDate.date

            context?.save(&error)

        self.dismissViewControllerAnimated(true, completion: {});

当解散调制数据没有更新时,我必须回到第一个控制器重新加载数据并再次继续。

我认为这是因为我没有 NSFetchRequest(或 NSFetchResultsController)来获取最新的更改。

当我在模式中进行更改时,重新加载 selectedFolder 数据的最佳方法是什么?

你似乎想打电话给 moc.refreshObject(folder, mergeChanges:true)

请参阅文档 here

如果您的模态视图以全屏显示,您可以在 viewWillAppera() 中刷新第二个视图。

override func viewWillAppear(animated: Bool) { 
{ 
  folderNameLabel.text = selectedFolder?.title
  folderDetailsLabel.text = selectedFolder?.details
  folderDateLabel.text = displayDate
}