我有一个带搜索栏控制器和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)
当我使用搜索栏控制器时如何编辑元素?
答案 0 :(得分:0)
您正在更新由获取的结果控制器提取的数据集,而不更新表视图。
了解您必须为更改准备表视图,然后重新加载表视图,确保表视图数据源方法响应数据集中的更改。
您可能还需要确保表视图委托方法响应更改,具体取决于您的实现。