Hevens
Hevens

Reputation: 21

Swift 2 Core Data: delete object ok! but no Refresh Row in TableView

This code works correctly, deletes in Core Data. Table view set DELETE in red to the right but does not delete the row in the table view.

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    let manageObject: NSManagedObject = frc.objectAtIndexPath(indexPath) as! NSManagedObject
moc.deleteObject(manageObject)

    do {
        try moc.save()
    } catch {
        print("Failed to save")
        return
    }
}

If I do stop the App and then I run it again, the table view do not sample row deleted and sample rows that they remain.

Upvotes: 2

Views: 846

Answers (1)

vadian
vadian

Reputation: 285059

Delete the item explicitly by adding

tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

after moc.deleteObject()

or add the NSFetchedResultsControllerDelegate methods

func controllerWillChangeContent(controller: NSFetchedResultsController) {
  self.tableView.beginUpdates()
}

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
  switch type {
  case .Insert:
    tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
  case .Delete:
    tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
  case .Update:
    self.configureCell(tableView.cellForRowAtIndexPath(indexPath!)!, atIndexPath: indexPath!)
  case .Move:
    tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
    tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
  }
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
  self.tableView.endUpdates()
  self.tableView.reloadData()
}

Upvotes: 2

Related Questions