从TableView

时间:2015-11-05 01:53:32

标签: ios swift uitableview

我正在尝试从TableView中删除一个项目但是当我向左滑动并单击删除时,我收到此错误:

error when swipe

这是我的代码,当我评论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中有多个itens,就会发生。

更新2

@harshayarabarla给出的答案对我有用,因为我忘了在deleteRowsAtIndex之前添加self.products.removeAtIndex(indexPath.row)

谢谢!

2 个答案:

答案 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
        }
    }