我正在尝试从 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’转换为不相关的类型‘NSManagedObject’总是失败。”有谁知道我该如何解决这个问题?我读过,您可以使用 fetchedResultsController 轻松处理表中的核心数据,但我是编程新手,发现一般设置核心数据时该方法有点困惑。 fetchedResultsController 是管理我的 TableView 中的数据所必需的吗?
最佳答案
从你的错误来看,addBook.myBooks
是一个字符串数组。
直接的问题是 deleteObject
不适用于字符串,它适用于托管对象——即 NSManagedObject
的实例或 的子类NSManagedObject
。你不能像那样从 Core Data 中删除一个字符串,你必须删除与该字符串对应的托管对象。该错误专门告诉您 as! NSManagedObject
不适用于字符串,因为字符串与托管对象完全不同。
[您通过 removeAtIndex
删除 indexPath.row
处的字符串,然后又尝试使用 indexPath 处的字符串,这也是一个问题。行
,但那不是这里的真正问题。]
您需要做的是找到与您要删除的 TableView 行对应的托管对象,并将其传递给 deleteObject
。如果不更全面地了解您的 View Controller 如何工作,就不可能确切地说出您将如何做到这一点,但有几件事是明确的:
您方法中的前三行没有做任何有用的事情。削减它们——即使你让它们起作用,它们在这里也是错误的方法。您不希望必须在此处获取要删除的托管对象。到达此方法时,您应该已经知道如何删除它。
没有必要使用
NSFetchedResultsController
将核心数据与 TableView 放在一起。但是,如果您是编程新手,您可能会发现使用它会容易得多。
关于ios - 同时从 TableView 行和核心数据中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31527486/