ios - UITableView cellForRowAt 在 numberOfRowsInSection 之前

标签 ios swift uitableview

所以我有一个带有 TableView 的 View Controller 。这个 View Controller 有一个按钮,点击它会打开另一个 View Controller 。此 View Controller 上有一个按钮,可以更改 TableView 的数据集并关闭 View Controller 。

问题是当更改数据集并关闭它调用的 View Controller 时 cellForRowAt。但是因为项目的数量有可能减少,所以我得到了一个 Index out of range 错误。

设置一些断点后,我意识到这是因为在更新和关闭 View Controller 后 cellForRowAt 被调用但 numberOfRowsInSection 没有。因此行数已更新,但未反射(reflect)在 TableView 中。

我可以检查 cellForRowAt 以查看它是否超出范围,如果超出范围则返回一个空单元格,但这似乎非常低效。尽管无论如何这都可能是个好主意,但在这种情况下似乎是一种创可贴修复。

那么我怎样才能有效且高效地解决这个问题呢?

最佳答案

有两种解决方案可以解决此问题。

  1. 更新数据集后,只需调用 reloadData在您的 tableView 上,它将重新加载所有数据。

  2. 如果删除了某些数据,则使用 deleteRows(at:with:)方法 。

用于单行删除

data.remove(at: index)
self.tableView.deleteRows(at: [indexPath], with: .fade)

多行插入删除

 var indexPaths: [IndexPath] = []
 for index in indexArray
   data.remove(at: index)
   indexPaths.append(IndexPath(item: index, section: 0))
 }

 if #available(iOS 11.0, *) {
    self.tableView.performBatchUpdates({
       self.tableView.deleteRows(at: indexPaths, with: .fade)
    })
 } else {
     self.tableView.beginUpdates()
     self.tableView.deleteRows(at: indexPaths, with: .fade)
     self.tableView.endUpdates()
 }

如果要删除多行,只需创建一个具有匹配行索引的索引路径数组,并将其传递给删除函数即可。

编辑: 仅对多个插入/删除/移动操作使用批量更新。根据苹果文档

UITableView 推迟任何行或部分的插入,直到它处理完行或部分的删除/插入。无论插入和删除方法调用的顺序如何,都遵循此顺序。

关于ios - UITableView cellForRowAt 在 numberOfRowsInSection 之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47767222/

相关文章:

ios - Swift - TableView 将 IndexPath 返回为 nil

iphone - 选择时动画 UITableViewCell 高度

ios - 从 NSData 读取 XMP 元数据

ios - 如何将 NSNotification.Name 重新定义为枚举?

ios - 来自模板的 NSFetchRequest - Xcode 5 编辑器重写表达式

swift - 参数类型 '()'与预期的 'View'类型不一致SwiftUI吗?

ios - 将数据传递给自定义 View 然后执行函数是一种好方法吗?

ios - 点击时更改 UITableView 中的单元格内容

swift - 尝试在 tvOS 上输入文本时,UISearchController 与 UIAlertController 结合出现问题

iphone - NSMutableArray 中的 UITableView 分组部分