在numberOfRowsInSection之前的UITableView cellForRowAt

时间:2017-12-12 07:22:16

标签: ios swift uitableview

所以我有一个具有表视图的视图控制器。此视图控制器有一个按钮,单击该按钮可打开另一个视图控制器。此视图控制器上有一个按钮,用于更改表视图的数据集并关闭视图控制器。

问题是当更改数据集并解除视图控制器时,它会调用cellForRowAt。但由于项目数量有可能减少,我会收到Index out of range错误。

在设置了一些断点之后,我意识到这是因为在更新和解除视图控制器cellForRowAt之后会被调用但numberOfRowsInSection没有。因此行数已更新,但未反映在表视图中。

我可以在cellForRowAt进行检查以查看它是否超出了范围,并且如果是这样则返回一个空单元格,但这看起来非常低效。虽然这可能是一个好主意,但在这种情况下看起来像是这样的创可贴。

那么如何以有效和高效的方式解决这个问题呢?

2 个答案:

答案 0 :(得分:2)

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

  1. 更新数据集后,只需调用tableView上的reloadData即可重新加载所有数据。

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

  3. 单行删除

    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延迟任何行或节的插入,直到它处理了行或节的删除/插入为止。无论如何排序插入和删除方法调用,都会遵循此顺序。

答案 1 :(得分:1)

您可以在viewWillAppear方法中调用tableView.reloadData。因此,它将再次使用新数据重新加载完整的tableview。