当我调用此代码时:
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
会创建一个新细胞吗?为什么?我认为如果细胞存在,不需要创建。
答案 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指出的那样。你的计时器不应该活在牢房里。它可以包含一个参考。当您尝试更改单元格上的数据时,可以更轻松地访问计时器。但您还必须在每个单元的控制器数据结构中包含计时器。
您现在有两种解决方案:
重新加载单元格,您将获得新单元格。那么你应该从控制器上包含定时器的数据结构中填充它。
或强>
- 使用
醇>bundTableView.cellForRow
访问该行。如果显示该单元格,您可以使用其中的数据。否则,使用 控制器上的数据。我会说总是使用你控制器的数据。
第一种方式显然在内存和时间方面更具有成本,因为你正在构建霍尔单元格。