【问题标题】:How can I fix this Invalid update: invalid number of rows in section 0 error?如何修复此无效更新:第 0 节错误中的无效行数?
【发布时间】:2026-01-19 00:20:08
【问题描述】:

我正在用UITableViewin Swift 5 进行实验。

我想插入和删除行。

添加其他行时,我的表崩溃了。第一个插入工作正常。

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 节中的行数。包含在第 0 节中的行数 更新后的现有节(10)必须等于 更新前该部分中包含的行 (5),加号或减号 从该部分插入或删除的行数(插入 10 行, 0 已删除)加或减移入或移出的行数 该部分(0 移入,0 移出)。'

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

    创建索引路径数组的循环不正确。您希望它迭代 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)
    }
    

    【讨论】:

    • 哦,我喜欢这个,我总是忘记indices - 我想我肯定更喜欢这个而不是我的尝试
    【解决方案2】:

    我认为您需要在计算 IndexPath 集合后附加到 items

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

    试试这个:

    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)
    }
    

    【讨论】:

      【解决方案3】:

      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)
      }
      

      【讨论】:

        最近更新 更多