Search code examples
iosswiftcore-datansfetchrequest

How to update managed object data?


I have started my first core data application. I am working with one entity right now called 'Folder'.

The first view controller displays all the Folders in a tableview, which I can add to and it reloads the data. This works fine because It uses the fetch request to populate the 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()

 }

However when segueing to another view controller via the table cell I pass on the selected Folder data to the controller using the index path. e.g.

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

My second view controller uses the data passed from the first table view to display in textfields:

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

I then have a modal to edit/save the folder data in a modal appearing from the second controller:

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

When dismissing the modulate data is not updated, I have to go back to the first controller to reload the data and segue again.

I think this is because I have no NSFetchRequest (or NSFetchResultsController) to get the most recent changes.

What is the best method to reload the data of the selectedFolder when I make the changes in the modal ?


Solution

  • You can refresh your second view in viewWillAppera() if your modal view is presented in full screen.

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