即使我按顺序删除,部分中的行数也无效 [英] Invalid number of rows in section even though I delete in order

查看:33
本文介绍了即使我按顺序删除,部分中的行数也无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 tableView,用户可以在其中删除 cells.这是在 cellForRowAt 中的 class WhishlistTableViewController: UITableViewController:

I have a tableView in which the user can delete cells. This is in cellForRowAt in class WhishlistTableViewController: UITableViewController:

cell.deleteWishCallback = { [unowned self] deletedCell in
    print("delete with callback")
    guard let indexPath = tableView.indexPath(for: deletedCell) else { return }
    self.deleteWishDelegate?.deleteWish(indexPath, currentWish.wishCounter)
    self.wishData.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .right)
    print("removed from tableView")
}

但我仍然使用 delegate 从数据库中删除 Wish 以及从 ViewController 内的主要 datasourceArray 这样我就可以将它安全地保存到 UserDefaults:

But I am still using the delegate to remove the Wish from the database and also from my main datasourceArray inside the ViewController so I can safe it to UserDefaults:

extension WishlistViewController: DeleteWishDelegate {
    func deleteWish(_ idx: IndexPath, _ wishCounter: Int){
        // remove the wish from the user's currently selected wishlist
        print("delete2")
        self.dataSourceArray[currentWishListIDX].wishes.remove(at: idx.row)
        if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
            defaults.setDataSourceArray(data: self.dataSourceArray)
            defaults.synchronize()
        } else {
            print("error")
        }
        DataHandler.deleteWish(wishCounter, self.dataSourceArray[currentWishListIDX].name)
    }
}

但是,如果我删除 cells 并再次添加,则会导致错误:

However this causes an error if I delete cells and add again:

'无效更新:第 0 节中的行数无效.更新后现有节中包含的行数 (5) 必须等于更新前该节中包含的行数 (2),加上或减去从该部分插入或删除的行数(插入 1 行,删除 0 行),加上或减去移入或移出该部分的行数(0 移入,0 移出).'

'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (2), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

我搜索了那个,当你没有按正确的顺序删除时,这通常会触发,但我认为我是按照正确的方式做的?(首先来自 tableViewData(wishData),然后来自 tableView 本身和 deleteRows.我在这里遗漏了什么?

I searched for that and this usually fire when you don't delete in the right order but I thought I am doing it the right way? (first from the tableViewData(wishData) and then from the tableView itself with deleteRows. What am I missing here?

顺便说一下,删除 cell 时,这是 print-statements 的顺序:

By the way when deleting a cell this is the order of the print-statements:

使用回调删除

删除2

行数:2

从 tableView 中移除

removed from tableView

更新:

正如评论中所建议的,问题可能在于我如何添加 cells.我就是这样做的:

As suggested in the comments, the problem might be in how I add cells. This is how I do that:

func addWishComplete(wishName: String, selectedWishlistIDX: Int, wishImage: UIImage?, wishLink: String?, wishPrice: String?, wishNote: String?, wishCounter: Int?) {
    
    let wishToAdd = Wish(name: wishName, link: wishLink!, price: wishPrice!, note: wishNote!, image: wishImage!, checkedStatus: false, wishCounter: wishCounter!)
    
    self.dataSourceArray[selectedWishlistIDX].wishes.append(wishToAdd)
    DataHandler.saveWish(dataSourceArray: self.dataSourceArray, selectedWishlistIdx: selectedWishlistIDX, wish: wishToAdd)
    // save dataSourceArray with new wish in UserDefaults
    if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
        defaults.setDataSourceArray(data: self.dataSourceArray)
        defaults.synchronize()
    } else {
        print("error wish to datasource")
    }

    // only update current list if selectedWishlist is currentWishlist
    if selectedWishlistIDX == currentWishListIDX {
        wishList.wishes.append(Wish(name: wishName, link: wishLink!, price: wishPrice!, note: wishNote!, image: wishImage!, checkedStatus: false, wishCounter: wishCounter!))
        
        theTableView.wishData = wishList.wishes
        theTableView.tableView.beginUpdates()
        theTableView.tableView.insertRows(at: [
            (NSIndexPath(row: theTableView.wishData.count-1, section: 0) as IndexPath)], with: .left)
        theTableView.tableView.endUpdates()
    }
    dismissWishView()
}

推荐答案

我发现了问题.正如评论中已经提到的,我必须可以直接在 wishData 上工作以 remove :

I found the problem. As already mentioned in the comments I have to can work directly on wishData to remove :

func addWishComplete(wishName: String, selectedWishlistIDX: Int, wishImage: UIImage?, wishLink: String?, wishPrice: String?, wishNote: String?, wishCounter: Int?) {
    
    let wishToAdd = Wish(name: wishName, link: wishLink!, price: wishPrice!, note: wishNote!, image: wishImage!, checkedStatus: false, wishCounter: wishCounter!)
    
    self.dataSourceArray[selectedWishlistIDX].wishes.append(wishToAdd)
    DataHandler.saveWish(dataSourceArray: self.dataSourceArray, selectedWishlistIdx: selectedWishlistIDX, wish: wishToAdd)
    // save dataSourceArray with new wish in UserDefaults
    if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
        defaults.setDataSourceArray(data: self.dataSourceArray)
        defaults.synchronize()
    } else {
        print("error wish to datasource")
    }

    // only update current list if selectedWishlist is currentWishlist
    if selectedWishlistIDX == currentWishListIDX {
        wishList.wishes.append(wishToAdd)
        
        theTableView.wishData.append(wishToAdd)
        theTableView.tableView.beginUpdates()
        theTableView.tableView.insertRows(at: [
            (NSIndexPath(row: theTableView.wishData.count-1, section: 0) as IndexPath)], with: .left)
        theTableView.tableView.endUpdates()
    }
    dismissWishView()
}

感谢大家的帮助!

这篇关于即使我按顺序删除,部分中的行数也无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆