删除最后一行并同时加载多行

时间:2018-01-06 02:26:46

标签: swift uitableview

当我从表视图中删除最后一行时:

tableView.deleteRows(at: [indexPath], with: .middle)

并将我的表格数据源更改为另一个数组:

if orders.isEmpty {
    return ABCDArray.count
} else {
    return orders.count
}

它给了我这个错误:

  

由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'无效更新:第0部分中的无效行数。更新后现有部分中包含的行数(20)必须等于更新前的该部分中包含的行数(1),加上或减去从该部分插入或删除的行数(0插入,1删除)和加或减移入的行数或超出该部分(0移入,0移出)。'

我该如何解决?更改数据源有什么问题?

2 个答案:

答案 0 :(得分:0)

在致电tableView.deleteRows(at: [indexPath], with: .middle)之前,您需要从数据阵列中删除该对象。所以,你的代码应该是这样的:

// Editing of rows is enabled
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        //when delete is tapped
        orders.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .middle)
    }
}

答案 1 :(得分:0)

这是一个有趣的问题所以我决定尝试一下。

我做了一个快速的实现,我相信这不是最漂亮的方式,但如果你可以受到这样的启发:

class ViewController : UITableViewController {

    var orders = [1,2,3,4]
    var ABCDArray = ["A","B","C","D"]

    var currentCellNumber = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        currentCellNumber = orders.count

        tableView?.delegate = self
        tableView?.dataSource = self
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        if orders.isEmpty {
            cell.textLabel?.text = ABCDArray[indexPath.row]
        } else {
            cell.textLabel?.text = String(orders[indexPath.row])
        }
        return cell
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return currentCellNumber
    }


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        if !orders.isEmpty {
            orders.remove(at: indexPath.row)
            currentCellNumber -= 1
            tableView.deleteRows(at: [indexPath], with: .middle)

            if orders.isEmpty {
                changeDataSource(newDataSourceArray: ABCDArray)
            }

        }
    }

    func changeDataSource(newDataSourceArray array: Array<Any>) {
        var newCellIndexPaths = [IndexPath]()
        for row in 0...array.count-1 {
            print(row)
            currentCellNumber = row+1
            print(currentCellNumber)
            let insertionIndexPath = IndexPath(row: row, section: 0)
            print(insertionIndexPath)
            newCellIndexPaths.append(insertionIndexPath)

        }
        tableView.insertRows(at: newCellIndexPaths, with: .automatic)
    }

}

如果你有一些问题,甜甜圈犹豫&gt;希望它有所帮助