从 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
        
    

我在堆栈溢出中搜索并找到了关于此beginUpdatesendUpdates 的信息。

谢谢。

更新

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()而不是beginUpdatesendUpdates()吗? 我跑了断点,它发生在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 中插入和删除行

如何从数组中删除项目?

从 TableView 中的 CoreData 中删除实体时出错

如何在 Firebase 中删除 tableview 项目后删除它们

我的 TableViewCell 没有从核心数据中删除,当 tableview 重新出现时重新出现

尝试快速从数组中删除时,不应删除 tableview 单元格中的最后一个单元格