lascoff
lascoff

Reputation: 1331

Delete row from UITableView using NSFetchedResultsController

I am trying to delete a row in UITableView. The data for the table comes from core data entity using NSFetchedResultsController. This is my code to delete the row:

func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) {
    if (editingStyle == UITableViewCellEditingStyle.Delete) {

        let managedObject:NSManagedObject = fetchedResultsController.objectAtIndexPath(indexPath) as! NSManagedObject
        context?.deleteObject(managedObject)
        do {
            try context?.save()
        } catch {
            print("error")
        }

        favoritesList.reloadData() // UITableView
    }
} 

Should be simple but I can't seem to delete a row. Please help...

Upvotes: 1

Views: 803

Answers (1)

aaisataev
aaisataev

Reputation: 1683

Here is the part of my code deleting rows:

override func tableView(_: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
//creating a delete button

let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete") { (UITableViewRowAction, NSIndexPath) -> Void in

  if let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext {

    let restaurantToRemove = self.fetchedResultsController.objectAtIndexPath(indexPath) as! Pub
    managedObjectContext.deleteObject(restaurantToRemove)

    if managedObjectContext.hasChanges {
      do {
        try managedObjectContext.save()
      } catch let nserror as NSError {
        NSLog("some error \(nserror), \(nserror.userInfo)")
        abort()
      }
    }
  }
}
deleteAction.backgroundColor = UIColor.redColor()

return [deleteAction]
}

and these three methods:

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

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {

switch type {
case .Delete:
  tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
case .Insert:
  tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
case .Update:
  tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
default:
  tableView.reloadData()
}

pubs = controller.fetchedObjects as! [Pub]
}

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

Upvotes: 1

Related Questions