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会创建一个新的细胞吗?为什么?我认为如果单元格存在,则无需创建。

4

2 回答 2

2

可重复使用的单元格尝试重复使用已超出 SCRREN的单元格。

例如,您有 10 个项目要显示。但是,如果您的手机只能显示 5 个单元格,那么当您向下滚动到第 6 个单元格时,它会重复使用第 1 个单元格(因为它超出了视野)并创建第 6 个单元格。

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

于 2017-09-29T14:47:10.627 回答
0

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

根据您在这里的经验,它还表明细胞得到了重建。我很确定这不仅会导致您将新单元格加入队列。它还会从内存中删除旧单元格(不再指向它们)。即使您向下滚动表格,旧单元格也将不再使用。他们走了。

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

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

你认为它太长了。但是,这是正确的方法。正如您所经历的那样,重新加载单元格的成本更高,并且没有必要强迫这种行为。我认为我们不能。

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

您现在有两种解决方案:

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

    或者

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

第一种方法在内存和时间方面显然更昂贵,因为您正在构建大厅单元。

于 2017-09-29T15:18:31.243 回答