我正在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)。
答案 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)
}