滚动时 UITableViewCell 内容会发生变化,因为在其中一个单元格中运行计时器
Posted
技术标签:
【中文标题】滚动时 UITableViewCell 内容会发生变化,因为在其中一个单元格中运行计时器【英文标题】:UITableViewCell contents change when scrolling because running a timer in one of the cell 【发布时间】:2018-04-08 08:01:44 【问题描述】:我有一个包含 3 个单元格的表格视图。在其中一个单元格中,我试图显示一个计时器,该计时器在滚动时显然会弄乱我的单元格内容。
这是我的代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! StatsuSessionTableViewCell
if indexPath.row == 0
// do something
return cell
else if indexPath.row == 1
// do something
return cell
else if indexPath.row == 2
_ = Timer.every(1.second) (timer: Timer) in
let time = self.date.timeIntervalSince(Date())
cell.statusTitle.text = "TIME"
cell.statusDescription.text = time.timerFormat
if time < 0
timer.invalidate()
return cell
return cell
如果我删除计时器并只显示一些文本,我没有任何问题。但显然因为单元格被破坏并重新创建,这弄乱了我的内容,计时器也会出现在 indexpath.row 0 而不仅仅是 indepxath.row 2。
有什么解决方法吗?
【问题讨论】:
这是一个猜测,所以我不会把它写成答案(还没有!),但我认为这是因为单元格重用 - 第一次,单元格在第 2 行,另一次不是,但计时器从第一次开始就在那里。一个快速测试看看是否是这种情况是每次都创建一个新单元格(在第 2 行),看看问题是否消失。如果是这样,我会查看设置标签或其他内容,如果设置了标签并且它不在正确的行中,则使计时器无效。 您的意思是在第 2 行的 if 语句中创建单元格?因为我试过了,它做同样的事情...... 不,我的意思是代码面板的第 2 行。以let cell = tableView.dequeueReusableCell...
开头的那个
不要在单元格中运行计时器。单元格应该是模型中数据的轻量级显示。如果你的模型应该根据时间更新,那么在模型或视图控制器中进行。例如。 ***.com/questions/49246036/…
@Paulw11:是的,这更有意义。感谢您的链接。
【参考方案1】:
所以您的问题是您正在cellForRowAt:
中创建计时器。计时器也适用于通过重用此单元创建的单元。所以你必须在StatsuSessionTableViewCell
中实现这个定时器逻辑。还要在单元格中实现prepareForReuse
方法并使那里的计时器无效。这是我能建议的最安全的方法。
【讨论】:
以上是关于滚动时 UITableViewCell 内容会发生变化,因为在其中一个单元格中运行计时器的主要内容,如果未能解决你的问题,请参考以下文章
滚动后 UITableViewCell 内的 UIView 中的渐变发生了变化