reloadRows将创建新单元格

时间:2017-09-29 14:02:41

标签: ios swift uitableview swift3.2

当我调用此代码时:

tableView.reloadRows(at: [IndexPath(item: index, section: 0)], with: .none)

tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: changeBankCardTableViewCellReuseId) as! MyCell
}

这个单元格出列的是新单元格,即使这个单元格正在显示(我不想创建新单元格,因为我的单元格有一个计时器,它会改变我的标题)

所以我改变了我的代码,就像这样:

let indexPath = IndexPath(item: index, section: 0)
if let cell = bundTableView.cellForRow(at: indexPath),
cell is ChangeBankCardTableViewCell {
    let myCell: ChangeBankCardTableViewCell = cell as! MyCell
    /// do some thing
}

但是,这太长了,myCell必须导出函数才能调用。

dequeueReusableCell会创建一个新细胞吗?为什么?我认为如果细胞存在,不需要创建。

2 个答案:

答案 0 :(得分:1)

可重复使用的细胞试图重新使用那些不会出现碎片的细胞

例如,您有10个要显示的项目。但是如果你的手机只能显示5个细胞,那么当你向下滚动到第6个细胞时,它会重复使用第一个细胞(因为它已经失去视力)并创建了第6个细胞。

但请记住,重用并不意味着它会重置您为第一个单元格设置的所有属性。例如,您关闭第一个单元格的isUserInteractionEnable为false,然后当第6个单元格重用第一个单元格时,第6个单元格的isUserInteractionEnable保持为false。

答案 1 :(得分:0)

根据我的经验,我知道在tableview上重新加载数据会让tableview失去一些属性值。例如选定的单元格。

根据您的经验,它还显示细胞得到重建。我很确定它不仅会导致你释放新细胞。它还会从记忆中移除旧细胞(不再指向它们)。即使向下滚动表格,旧单元格也不会再使用了。他们走了。

是的,您应该将代码更改为:

let indexPath = IndexPath(item: index, section: 0)
if let cell = bundTableView.cellForRow(at: indexPath)

你认为它太长了。但是,它是正确的方法。正如你所经历的那样,重新加载细胞更加省力,并且没有必要试图强迫这种行为。而且我认为我们不能。

正如Paulw11指出的那样。你的计时器不应该活在牢房里。它可以包含一个参考。当您尝试更改单元格上的数据时,可以更轻松地访问计时器。但您还必须在每个单元的控制器数据结构中包含计时器。

您现在有两种解决方案:

  
      
  1. 重新加载单元格,您将获得新单元格。那么你应该从控制器上包含定时器的数据结构中填充它。

         

  2.   
  3. 使用bundTableView.cellForRow访问该行。如果显示该单元格,您可以使用其中的数据。否则,使用   控制器上的数据。我会说总是使用你控制器的数据。
  4.   

第一种方式显然在内存和时间方面更具有成本,因为你正在构建霍尔单元格。