我试图从TableView和名为" Books。"的实体中删除项目。但是,我不知道我是否在正确的轨道上。当我尝试这段代码时:
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)
}
}
我在最后一行上收到警告,说出"来自' String'不相关的类型&#NS; NSManagedObject'总是失败。"有谁知道我怎么能解决这个问题?我已经读过你可以使用fetchedResultsController轻松处理表中的核心数据,但我是编程新手,发现这种方法在设置核心数据时更加困惑。是否需要fetchedResultsController来管理我的TableView中的数据?
答案 0 :(得分:2)
从您的错误中可以看出addBook.myBooks
是一个字符串数组。
当前的问题是deleteObject
不适用于字符串,它适用于托管对象 - 即NSManagedObject
的实例或NSManagedObject
的子类。您无法从Core Data中删除字符串,您必须删除与该字符串对应的托管对象。该错误特别告诉您as! NSManagedObject
对字符串不起作用,因为字符串与托管对象完全不同。
[问题是您要通过indexPath.row
删除removeAtIndex
处的字符串,然后尝试使用您刚删除的indexPath.row
处的字符串,但这不是真正的问题在这里。]
您需要做的是找出与您要删除的表视图行对应的托管对象,并将其传递给deleteObject
。如果没有关于视图控制器如何工作的更全面的图片,就不可能准确地说出你将如何做到这一点,但有一些事情是明确的:
您方法中的前三行没有做任何有用的事情。削减他们 - 即使你让他们工作,他们在这里是错误的方法。您不希望在此处获取您要删除的托管对象。当您达到此方法时,您应该已经足够了解它。
使用NSFetchedResultsController
将核心数据与表格视图放在一起不是必要。但如果你是编程新手,如果你使用它,你可能会发现事情要容易得多。
答案 1 :(得分: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)
}