Таймер сбрасывается и останавливается во время прокрутки UITableView - PullRequest
0 голосов
/ 08 июня 2018

timer.gif

show Я показываю проблему в этом GIF ↑↑↑↑↑

Есть таймер иstratButton в ячейке tableView, когда я нажимаю кнопку, запускается 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 голосов
/ 08 июня 2018

Удалите cell.timer?.invalidate() из cellForRowAt метода, потому что каждый раз, когда вы прокручиваете tableView, этот метод вызывается для отображения новых ячеек.В вашем случае, когда вы запустили таймер для ячейки, и эта ячейка не отображается, в следующий раз, когда вы прокрутите, чтобы снова отобразить эту ячейку в представлении cell.timer?.invalidate(), она остановится.

0 голосов
/ 08 июня 2018

Вам нужно сохранить состояние каждой ячейки

class Service {

   static let shared = Service()

   var myTimerList = [TimerClass]()
}

//

здесь я добавил еще 2 переменные, почему осталось 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 
0 голосов
/ 08 июня 2018

Вы повторно используете UITableViewCell.Это означает, что когда ячейка исчезнет с экрана, она будет повторно использована для попадания ячейки на экран.Всякий раз, когда это происходит, он вызывает метод делегата - означает, что cell.timer?.invalidate() вызывается снова и снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...