搜索栏控制器和NSFetchedResultsController

时间:2015-12-02 17:52:10

标签: ios swift uitableview core-data

我有一个带搜索栏控制器和NSFetchedResultsController的表格:

class CartViewController: UIViewController, NSFetchedResultsControllerDelegate, UITableViewDataSource, UITableViewDelegate, UISearchResultsUpdating {
    func controllerWillChangeContent(controller: NSFetchedResultsController) {
        self.tableView.beginUpdates()
    }

    func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {

        switch type {
            case .Insert:
                if let _newIndexPath = newIndexPath {
                    tableView.insertRowsAtIndexPaths([_newIndexPath], withRowAnimation: .Fade)
                }
            case .Delete:
                if let _indexPath = indexPath {
                    tableView.deleteRowsAtIndexPaths([_indexPath], withRowAnimation: .Fade)
                }
            case .Update:
                if let _indexPath = indexPath {
                    tableView.reloadRowsAtIndexPaths([_indexPath], withRowAnimation: .Fade)
                }
            default:
                self.tableView.reloadData()
        }

        self.products = controller.fetchedObjects as! [Product]
    }

}

我在这个tutorial中做了所有的事情。一切正常。但是如果我在搜索时尝试删除行:

func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {

        let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: "Delete",handler: { (action:UITableViewRowAction!, indexPath:NSIndexPath!) -> Void in

                    let product = (self.searchController.active) ? self.searchResults[indexPath.row]:self.products[indexPath.row]
                    product.setValue(false, forKey: "inCart")
                    do {
                        try self.appDelegate.managedObjectContext.save()
                    } catch {
                        fatalError("Failure to save context: \(error)")
                    }

            })
}

我收到了错误:

  

CoreData:错误:严重的应用程序错误。抓住了一个例外   在调用期间来自NSFetchedResultsController的委托   -controllerDidChangeContent :.无效更新:第0部分中的行数无效。现有部分中包含的行数   更新后(3)必须等于包含的行数   更新前的那一节(3),加上或减去行数   插入或删除该部分(0插入,1删除)和加号   或减去移入或移出该部分的行数(0移动   in,0搬出去了)。 with userInfo(null)

当我使用搜索栏控制器时如何编辑元素?

1 个答案:

答案 0 :(得分:0)

您正在更新由获取的结果控制器提取的数据集,而不更新表视图。

了解您必须为更改准备表视图,然后重新加载表视图,确保表视图数据源方法响应数据集中的更改。

您可能还需要确保表视图委托方法响应更改,具体取决于您的实现。