在核心数据应用程序中,我们可以滑动删除一行,但我希望通过选择多行来删除它们。
self.tableView.allowsMultipleSelectionDuringEditing = true我已经做了上面的工作,我也实施了通常的删除方法。我也尝试过这样的方法。
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
return UITableViewCellEditingStyle.Delete
}
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
let entry: DiaryEntry = self.fetchedResultsController.objectAtIndexPath(indexPath) as! DiaryEntry
let coreDataStack: CoreDataStack = CoreDataStack.defaultStack
coreDataStack.managedObjectContext.deleteObject(entry)
coreDataStack.saveContext()
}
func controllerWillChangeContent(controller: NSFetchedResultsController) {
self.tableView.beginUpdates()
}
var multipleSelection = false
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
switch type {
case .Insert :
if indexPath != newIndexPath {
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Automatic)
}
case .Delete :
if (multipleSelection == true) {
let selectedRows = self.tableView.indexPathsForSelectedRows
for selectionIndex in selectedRows! {
let indicesOfItemsToDelete = NSMutableIndexSet()
indicesOfItemsToDelete.addIndex(selectionIndex.row)
let entry: DiaryEntry = self.fetchedResultsController.objectAtIndexPath(selectionIndex) as! DiaryEntry
let coreDataStack: CoreDataStack = CoreDataStack.defaultStack
coreDataStack.managedObjectContext.deleteObject(entry)
coreDataStack.saveContext()
}
self.tableView.deleteRowsAtIndexPaths(selectedRows!, withRowAnimation: .Automatic)
} else {
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Automatic)
}
case .Update :
self.tableView.reloadRowsAtIndexPaths([indexPath!], withRowAnimation: .Automatic)
case .Move :
self.tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Automatic)
if indexPath != newIndexPath {
tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Automatic)
}
}
}
func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
switch type {
case .Insert :
self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Automatic)
case .Delete :
self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Automatic)
case .Update :
//let range: NSRange = NSMakeRange(0, (self.fetchedResultsController.sections?.count)!)
self.tableView.reloadSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Automatic)
default:
break
}
}当我按下编辑方法时,我将tableView的编辑设置为true,在选择之后,当我按delete按钮时,下面是代码。
let selectedRows = self.tableView.indexPathsForSelectedRows
multipleSelection = true
for selectionIndex in selectedRows! {
tableView(tableView, commitEditingStyle: .Delete, forRowAtIndexPath: selectionIndex)
}
self.tableView.deleteRowsAtIndexPaths(selectedRows!, withRowAnimation: .Automatic)
self.tableView.reloadRowsAtIndexPaths(selectedRows!, withRowAnimation: .Automatic)但是,我得到了一个错误: CoreData: error:严重的应用程序错误。在核心数据更改处理过程中捕获了异常。这通常是……的观察者中的一个错误。
谁能告诉我解决办法吗?
发布于 2016-05-07 07:45:06
不要通过要求表视图删除(提交编辑类型)来删除。获取托管对象的列表,以便自己删除并从上下文中删除它们,然后告诉表视图它们不见了(您已经这样做了)。另外,在告诉表行已消失后,不要重新加载它们。
https://stackoverflow.com/questions/37085833
复制相似问题