从 TableView 中删除项目时 AppDelegate 错误
Posted
技术标签:
【中文标题】从 TableView 中删除项目时 AppDelegate 错误【英文标题】:AppDelegate error when remove item from TableView 【发布时间】:2015-11-05 01:53:31 【问题描述】:我试图从我的 TableView 中删除一个项目,但是当我向左滑动并单击 Delete 时,我收到了这个错误:
这是我拥有的代码,当我评论 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 中有多个元素,就会发生这种情况。
更新 2
@harshayarabarla 给出的答案对我有用,因为我忘记在 deleteRowsAtIndex 之前添加self.products.removeAtIndex(indexPath.row)
。
谢谢!
【问题讨论】:
你的应用崩溃了!!!你有没有崩溃日志?放置异常断点以查看崩溃的位置 显示方法加载产品!!! func loadProductsToListOrder() self.products = ProductDatabase.listProduct(self.configurations.db!) self.tableView.reloadData() 你试过self.tableView.reloadData()
而不是beginUpdates
和endUpdates()
吗?
我跑了断点,它发生在self.tableView.endUpdates
之后
【参考方案1】:
在执行 self.tableView.deleteRowsAtIndexPaths 之前,您需要从表视图的数据源中删除对象。稍后您可以调用 self.tableView.reloadData 方法而不是开始更新和结束更新。不过没有必要调用 reloadData 方法,因为 self.tableView.deleteRowsAtIndexPaths 负责重新加载。
如果您在更改表视图的数据源之前调用 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
【讨论】:
【参考方案2】:有关完整历史记录,请参阅 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
【讨论】:
以上是关于从 TableView 中删除项目时 AppDelegate 错误的主要内容,如果未能解决你的问题,请参考以下文章
从 TableView 中的 CoreData 中删除实体时出错
如何在 Firebase 中删除 tableview 项目后删除它们