我正在尝试从TableView中删除一个项目但是当我向左滑动并单击删除时,我收到此错误:
这是我的代码,当我评论self.tableView.deleteRowsAtIndexPaths
行时,一切都适合我。
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
if let index: NSIndexPath = indexPath {
self.tableView.beginUpdates()
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
self.configurations.delete(ProductDatabase.deleteProduct(self.products[index.row]))
loadProductsToListOrder()
self.tableView.endUpdates()
}
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}
我搜索并在此处找到关于此beginUpdates
和endUpdates
的堆栈溢出。
谢谢。
更新
loadProductsToListOrder函数
func loadProductsToListOrder() {
self.products = ProductDatabase.listProduct(self.configurations.db!)
self.tableView.reloadData()
}
如果我的TableView中有一个元素,我就没有这个问题。如果我在TableView中有多个itens,就会发生。
更新2
@harshayarabarla给出的答案对我有用,因为我忘了在deleteRowsAtIndex之前添加self.products.removeAtIndex(indexPath.row)
。
谢谢!
答案 0 :(得分:0)
有关完整历史记录,请参阅Delete Data from Coredata Swift。
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
switch editingStyle {
case .Delete:
// remove the deleted item from the model
let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let context:NSManagedObjectContext = appDel.managedObjectContext!
context.deleteObject(myData[indexPath.row] as NSManagedObject)
myData.removeAtIndex(indexPath.row)
context.save(nil)
//tableView.reloadData()
// remove the deleted item from the `UITableView`
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
default:
return
}
}
还需要纠正这两行代码。
var myData: Array<AnyObject> = []
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
答案 1 :(得分:0)
在执行self.tableView.deleteRowsAtIndexPaths之前,需要从表视图的数据源中删除该对象。稍后您可以调用self.tableView.reloadData方法,而不是开始更新和结束更新。但是,没有必要调用reloadData方法,因为self.tableView.deleteRowsAtIndexPaths负责重新加载东西。
如果在更改表视图的dataSource之前调用self.tableView.deleteRowsAtIndexPaths,则可能会遇到此错误。
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
if let index: NSIndexPath = indexPath {
self.configurations.delete(ProductDatabase.deleteProduct(self.products[index.row]))
self.products.removeAtIndex(index.row)
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
loadProductsToListOrder() // you can comment this if you are not adding any new items to products array
}
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}