如何为包含Core Data过滤数据的UITableView实现滑动删除?

时间:2016-06-09 17:27:14

标签: swift uitableview core-data

我有两个带表格视图的VC,第一个显示类别,第二个显示所选类别的项目(食谱)。我能够使用NSPredicate让RecipeTableVC显示过滤数据,但我还没有弄清楚如何从Core Data中删除配方,因为显示的数据是一个只包含谓词数据的变量。

这是我的获取:

func attemptRecipeFetch() {
    let fetchRecipeRequest = NSFetchRequest(entityName: "Recipe")
    let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
    fetchRecipeRequest.sortDescriptors = [sortDescriptor]

    let controller = NSFetchedResultsController(fetchRequest: fetchRecipeRequest, managedObjectContext: ad.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
    fetchedRecipeController = controller

    do {
        try self.fetchedRecipeController.performFetch()
        let allRecipes = fetchedRecipeController.fetchedObjects as! [Recipe]
        recipesOfCategory = allRecipes.filter { NSPredicate(format: "category = %@", selectedCategory!).evaluateWithObject($0) }
    } catch {
        let error = error as NSError
        print("\(error), \(error.userInfo)")
    }
}

所以填充我的表的是recipesOfCategory数组。

这是我到目前为止删除的尝试:

func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        recipesOfCategory.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        ad.managedObjectContext.delete(recipesOfCategory[indexPath.row])
    }
}

这崩溃了,我理解为什么,但仍然没有提出解决方案。有没有办法实现滑动删除从Core Data删除配方的位置?我是否使用正确的方法用过滤后的数据填充表格?

2 个答案:

答案 0 :(得分:0)

tableView:commitEditingStyle:中,您需要从Core Data中删除基础对象,而不是从表视图中删除。 NSFetchedResultsController委托方法将告诉您何时从表视图中删除它。

答案 1 :(得分:0)

我使用以下代码' 滑动以从核心数据中删除'在我最近做的应用程序的表视图中。我可能会为你工作。

在您的" tableView:commitEditingStyle ",

<强> 1。使用...

设置CoreData访问权限
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context: NSManagedObjectContext = appDel.managedObjectContext

<强> 2。删除所需的行+包含。来自核心数据......

  

如果editingStyle == UITableViewCellEditingStyle.Delete {

     

context.deleteObject(self.resultsList [indexPath.row])//始终在之前   作为CoreD

        self.resultsList.removeAtIndex(indexPath.row)
            do {
                try context.save()
            } catch {
                print("Error unable to save Deletion")
            }

    } // end IF EditingStyle

    self.tableView.reloadData()