2015-07-20 2 views
0

Я пытаюсь удалить элементы из TableView и объекта под названием «Книги». Однако я не знаю, удалённо ли я на правильном пути. Когда я пытаюсь этот код:Удалять элементы из таблицы и строк данных таблицы одновременно

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

     var appdel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     var context:NSManagedObjectContext = appdel.managedObjectContext! 
     var request = NSFetchRequest(entityName: "Books") 

     if editingStyle == UITableViewCellEditingStyle.Delete { 

      addBook.myBooks.removeAtIndex(indexPath.row) 
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
      context.deleteObject(addBook.myBooks[indexPath.row] as! NSManagedObject) 

     } 
    } 

я получаю предупреждение в последней строке, которая говорит «Cast от„Строка“к неродственной типа„NSManagedObject“всегда терпит неудачу.» Кто-нибудь знает, как я могу обойти это? Я читал, что вы можете использовать fetchedResultsController для обработки основных данных в таблицах легко, но я новичок в программировании и нашел этот метод более запутанным при настройке основных данных в целом. Требуется ли fetchedResultsController для управления данными в моем TableView?

ответ

2

Из вашей ошибки это звучит как addBook.myBooks массив строк.

Непосредственная проблема заключается в том, что deleteObject не работает на струнах, он работает на управляемом objects-- то есть экземпляры NSManagedObject или подкласс NSManagedObject. Вы не можете удалить строку из Core Data, как это, вы должны удалить управляемый объект, соответствующий строке. Ошибка в частности говорит вам, что as! NSManagedObject не работает с строкой, потому что строка - это совершенно другая вещь из управляемого объекта.

[Это также проблема, что вы удаляете строку в indexPath.row через removeAtIndex, а затем пытаться использовать строку в indexPath.row, что вы только что удалили, но это не реальная проблема здесь.]

Что вам нужно выяснить, находится ли управляемый объект, соответствующий строке таблицы, которую вы удаляете, и передайте это значение deleteObject. Без полного представления о том, как ваш контроллер представления работы, невозможно точно сказать, как вы могли бы сделать это, но есть несколько вещей, которые понятны:

  1. Эти первые три строки в вашем методе ничего не делают полезно. Сократите их - даже если вы заставите их работать, они будут неправильным подходом здесь. Вы не хотите, чтобы fetch управляемый объект, который вы удаляете прямо здесь. Когда вы достигнете этого метода, вы уже должны знать достаточно, чтобы удалить его.

  2. Это не необходимо использовать NSFetchedResultsController для размещения данных Core вместе с табличными представлениями. Но если вы новичок в программировании, вы, вероятно, найдете намного проще, если будете использовать его.

0

Попробуйте сохранить контекст после DeleteObject

context.deleteObject(addBook.myBooks![indexPath.row]) 
      addBook.myBooks.removeAtIndex(indexPath.row) 

      do { 
       try context.save() 
      } 
      catch { 
       print("Error") 
      } 

      self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 


     }