↑↑↑↑↑↑↑↑↑我在这个GIF中显示问题↑↑↑↑↑
tableView单元格中有一个计时器和stratButton,当我单击Button时,timeLabel将开始运行。
现在问题是当我将正在运行的计时器滚出屏幕并向后滚动时,计时器将重置并停止。
希望有人可以帮助我!我检查了很多解决方案,但它们对我不起作用!我几乎哭了。我的cellForRow:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! TimerTableViewCell
cell.timer?.invalidate()
let item = myTimerList[indexPath.row]
cell.timerName.text = item.timerName
cell.secondLeftLabel.text = "\(item.timerSecond)"
return cell
}
我创建了一个包含我的代码的小项目,供您修改:https://app.box.com/s/axluqkjg0f7zjyigdmx1lau0c9m3ka47
答案 0 :(得分:0)
您正在重复使用UITableViewCell
。这意味着一旦单元格不在屏幕上,它将被重复用于进入屏幕的单元格。只要它发生,它就会调用委托方法 - 一次又一次地调用cell.timer?.invalidate()
。
答案 1 :(得分:0)
从cell.timer?.invalidate()
方法中删除cellForRowAt
,因为每次滚动tableView
时,都会调用此方法来显示新单元格。在您为单元格启动计时器并且该单元格不在视图中的情况下,下次滚动以将该单元格再次带到视图cell.timer?.invalidate()
时会导致其停止。
答案 2 :(得分:0)
您需要保留每个单元格的状态
class Service {
static let shared = Service()
var myTimerList = [TimerClass]()
}
//
这里我添加了另外两个变量,为什么timerName
会被遗忘,尽管你必须将它们相同,因为current
将保留不断变化的值
class TimerClass {
let timerSecond : Int
let timerName : String
var current: Int
var isPlaying = false
init(second:Int, name:String) {
timerSecond = second
timerName = name
current = second
}
}
//
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! TimerTableViewCell
let item = Service.shared.myTimerList[indexPath.row]
cell.tag = indexPath.row // to access the array inside the cell
if item.isPlaying {
cell.play() // add play method to the cell it has same button play action
}
else {
cell.timer?.invalidate()
}
cell.timerName.text = item.timerName
cell.secondLeftLabel.text = "\(item.current)"
return cell
}
//
单击按钮时单元格内的,将isPlaying属性更改为true,将此类停止时更改为false
// here self is the cell itself
Service.shared.myTimerList[self.tag].isPlaying = true
当计时器滴答时改变
Service.shared.myTimerList[self.tag].current = // value