如何更新托管对象数据?

Posted

技术标签:

【中文标题】如何更新托管对象数据?【英文标题】:How to update managed object data? 【发布时间】:2015-06-25 15:11:51 【问题描述】:

我已经启动了我的第一个核心数据应用程序。我现在正在与一个名为“文件夹”的实体合作。

第一个视图控制器在表格视图中显示所有文件夹,我可以添加它并重新加载数据。这很好用,因为它使用 fetch 请求来填充表。

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()

 

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

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        
    
 

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

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

然后我有一个模式来编辑/保存从第二个控制器出现的模式中的文件夹数据:

//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: );

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

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

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

【问题讨论】:

我会删除模态编辑器视图并使用您的第二个视图控制器来编辑文件夹对象。这是 ios 应用程序非常常见的设计。 iOS 通讯录应用就是一个很好的例子。 @PeterZhou 所以我可以在加载时禁用文本字段进行编辑,当我点击编辑然后启用它们进行编辑和保存? 是的。您的视图将有两种模式。查看模式和编辑模式。 如果您认为工作量太大并且您的模态视图全屏显示,解决您的问题的最简单方法是在 viewWillAppear 中重新加载您的文件夹对象。或者你必须找到一种方法来刷新你的第二个视图。您可以使用 NSNotification、Delegation 或 KVO。 目前我正在尝试重新加载对象,如下所示:func viewWillAppear() moc!.refreshObject(selectedFolder, mergeChanges:true) 但没有运气。可能只是将视图控制器更改为编辑/视图模式。仍在一步一步地学习 Core Data 【参考方案1】:

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

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

【讨论】:

您的模态视图是否全屏显示?如果是,是否可以在 folderNameLabel.text = selectedFolder?.title 行中添加断点来检查 viewWillAppear 是否被调用? 是的,我检查了函数 viewWillAppear 是否被调用,但它没有:/ @JKSDEV viewWillAppear 应该被自动调用...为了强制它,一个快速的技巧是在关闭模式视图之前调用 self.presentingViewController?.viewWillAppear()。 我有一个缺少参数的错误,所以我输入了 (true) 但仍然没有运气。我在关闭模式之前使用它。 @JKSDEV 所以我不熟悉 swift。函数签名错误。查看更新的答案。【参考方案2】:

您似乎想致电moc.refreshObject(folder, mergeChanges:true)

请参阅文档here。

【讨论】:

抱歉,我似乎添加了创建新文件夹代码而不是“编辑文件夹”代码。我会在上下文中使用类似的方法吗?另外,如果在模态中调用它,它将如何影响文件夹详细信息显示控制器? 我想你会想在viewWillAppear 的文件夹详细信息控制器上调用它,这样你每次访问控制器时总是知道你拥有最新的信息。

以上是关于如何更新托管对象数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用托管对象更新 UITableView?

Iphone:添加新对象时如何更新显示托管对象的表格视图

核心数据:更新托管对象不会调用 NSFetchedResultsControllerDelegate

如何更灵活的处理 CloudKit 从云端同步到本地的 CoreData 托管对象

如何更灵活的处理 CloudKit 从云端同步到本地的 CoreData 托管对象

Core Data,我如何有效地查找和删除托管对象