如何解决此无效更新:第0节中的行数无效错误?

时间:2019-06-19 19:35:13

标签: ios swift uitableview

我正在Swift 5中使用UITableView进行实验。

我想插入和删除行。

添加其他行时,我的表崩溃了。第一次插入就可以了。

class ViewController: UITableViewController {

    var items = [Int]()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.backgroundColor = .white
        tableView.tableFooterView = UIView()
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "CELL_ID")

        DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
            self.addMoreRows([1,2,3,4,5])
        }

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.addMoreRows([6,7,8,9,10])
        }

    }

    private func addMoreRows(_ data: [Int]) {

        self.items.append(contentsOf: data)

        var indexPaths = [IndexPath]()

        for i in 0...items.count - 1 {
            indexPaths.append(IndexPath(row: i, section: 0))
        }

        tableView.insertRows(at: indexPaths, with: .left)
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CELL_ID", for: indexPath)
        cell.textLabel?.text = "Cell #\(indexPath.row)"
        return cell
    }
}
  

由于未捕获的异常而终止应用程序   “ NSInternalInconsistencyException”,原因:“无效的更新:无效   第0节中的行数。   更新(10)之后的现有部分必须等于   更新(5)之前该部分中包含的行,正负   从该部分插入或删除的行数(已插入10行,   0已删除),加上或减去移入或移出的行数   该部分(移入0,移出0)。

3 个答案:

答案 0 :(得分:2)

您用于创建索引路径数组的循环不正确。您希望它遍历data.count,而不是items.count。并且您希望新的索引路径基于先前的items.count

private func addMoreRows(_ data: [Int]) {
    var indexPaths = [IndexPath]()

    for i in data.indices() {
        indexPaths.append(IndexPath(row: items.count + i, section: 0))
    }

    self.items.append(contentsOf: data)

    tableView.insertRows(at: indexPaths, with: .left)
}

答案 1 :(得分:0)

我认为您需要在计算items集合之后追加到IndexPath上。

您还应该使用一个范围来支持下一次迭代。

尝试一下:

private func addMoreRows(_ data: [Int]) {

    var indexPaths = [IndexPath]()

    for i in items.count...items.count + data.count - 1 {
        indexPaths.append(IndexPath(row: i, section: 0))
    }

    self.items.append(contentsOf: data)

    tableView.insertRows(at: indexPaths, with: .left)
}

答案 2 :(得分:0)

addMoreRows中,索引路径始终以0开头,因此在第二个调用中,将创建10个索引路径。

一种更可靠的方法是在插入前后对项目进行计数

private func addMoreRows(_ data: [Int]) {
    let startIndex = self.items.count
    self.items.append(contentsOf: data)
    let endIndex = self.items.count

    var indexPaths = [IndexPath]()

    for i in startIndex..<endIndex {
        indexPaths.append(IndexPath(row: i, section: 0))
    }

    tableView.insertRows(at: indexPaths, with: .left)
}