【问题标题】:Delete items from tableview row and core data simultaneously同时从 tableview 行和核心数据中删除项目
【发布时间】:2015-07-20 22:35:59
【问题描述】:

我正在尝试从 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 中的数据所必需的吗?

【问题讨论】:

    标签: ios iphone swift xcode6


    【解决方案1】:

    从您的错误看来,addBook.myBooks 是一个字符串数组。

    直接的问题是deleteObject 不适用于字符串,它适用于托管对象——即NSManagedObject 的实例或NSManagedObject 的子类。您不能像这样从 Core Data 中删除字符串,您必须删除与该字符串对应的托管对象。该错误专门告诉您as! NSManagedObject 不适用于字符串,因为字符串与托管对象完全不同。

    [这也是一个问题,您通过removeAtIndex 删除indexPath.row 处的字符串,然后尝试使用您刚刚删除的indexPath.row 处的字符串,但这不是真正的问题。]

    您需要做的是找出与您要删除的表视图行对应的托管对象,并将其传递给deleteObject。如果没有更全面地了解您的视图控制器是如何工作的,就不可能确切地说出您将如何做到这一点,但有几件事是清楚的:

    1. 您方法中的前三行没有做任何有用的事情。剪掉它们——即使你让它们起作用,它们在这里也是错误的方法。您不想在此处获取要删除的托管对象。当您使用此方法时,您应该已经知道足以将其删除。

    2. 使用NSFetchedResultsController 将Core Data 与表视图放在一起并不是必要。但是,如果您是编程新手,使用它可能会发现事情变得容易得多。

    【讨论】:

      【解决方案2】:

      尝试在 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)
      
      
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        相关资源
        最近更新 更多