在滚动UITableView期间,计时器将重置并停止运行

时间:2018-06-08 16:43:07

标签: ios swift uitableview timer

timer.gif

↑↑↑↑↑↑↑↑↑我在这个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

3 个答案:

答案 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