swift - TableView:是否可以在不重新加载 tableview 或部分的情况下删除现有行并插入新行?
问题描述
我有一个类别列表(部分标题中的CollectionView),我试图在部分行中显示数据而不重新加载部分标题。使用以下代码,
- 如果行(已加载的单元格)= post.count(要显示的新帖子)它可以工作
- 如果 rows > post.count 它有效
- 但是如果 rows < post.count ,它会给出错误,'无效更新:第 1 节中的无效行数。更新 (5) 后现有节中包含的行数必须等于其中包含的行数更新前的节 (2),加上或减去从该节插入或删除的行数(4 插入,2 删除),加上或减去移入或移出该节的行数(0 移入,0 移动出去)。'
var newIndexPaths = [IndexPath]() var rows = 0 rows = tableView.numberOfRows(inSection: 1) self.tableView.beginUpdates() if rows > posts.count { print("rows is greater") for row in 0...rows { if rows <= posts.count { break }else{ tableView.deleteRows(at: [IndexPath(item: row, section: 1)], with: .none) rows -= 1 } } } else if posts.count > rows { print("post is greater") for post in 0...posts.count{ if post < rows { newIndexPaths.append(IndexPath(row: post, section: 1)) } } self.tableView.insertRows(at: newIndexPaths, with: .none) } else { for row in 0...posts.count - 1 { newIndexPaths.append(IndexPath(row: row, section: 1)) break } } self.tableView.reloadRows(at: newIndexPaths, with: .none) self.tableView.endUpdates() ```
解决方案
是的,但您必须保持数据源数组和表视图同步。
如果posts
表示第 1 节的数据源数组,则可以插入一行
let insertionIndex = 0
posts.insert(newItem, at: insertionIndex)
tableView.insertRows(at: [IndexPath(row: insertionIndex, section: 1)], with: .automatic)
或删除一行
let indexToDelete = 5
posts.remove(at: indexToDelete)
tableView.deleteRows(at: [IndexPath(row: indexToDelete, section: 1)], with: .fade)
在这两种情况下cellForRowAt
都没有被调用。
重要的是,您首先 insert
/remove
项目进入/来自数据源,然后调用insert/deleteRows
这同样适用于多行。例如,您可以删除第 1 节中的所有项目
let indexPaths : [IndexPath] = posts.indices.map{[1, $0]}
posts.removeAll()
tableView.deleteRows(at: indexPaths, with: .fade).
在我的所有示例begin-/endUpdates
中都不需要,因为它是单个插入/删除操作。
推荐阅读
- python - 访问调用函数的变量
- android - 将 Parcelable 对象传递给片段类型不匹配
- javascript - 使用 javascript 和 element.style 属性动态调整元素大小
- django - Django 测试管理表单内联
- angularjs - 动态更改 ng-readonly
- graphql - 如何将 GraphQLSchema 对象转换为类型定义
- knex.js - schmas 的 KNEX 顺序已迁移
- java - iText 或 iTextSharp:当我使用 'PdfStamper' 时,目标文件使用 adobe.reader 验证签名失败
- python - 重新排列 StrucType 和嵌套的 ArrayType
- javascript - 身份服务器/getAccessToken();