Когда я прокручиваю ячейку tableView, таймер запуска в этой ячейке сбрасывается и останавливается - PullRequest
0 голосов
/ 08 июня 2018

В каждой ячейке есть таймер и кнопка запуска, когда я нажимаю кнопку запуска в этой ячейке, 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
}

Я хочу, чтобы таймер все еще работал, когда я прокручиваю tableView.

Ответы [ 2 ]

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

Вот ответ, который может быть полезен.

UITableViewCells существуют только на экране.Так что вы испытываете ожидаемое поведение.По сути, вам понадобятся таймеры вне области действия UITableViewCell, иначе они будут уничтожены, когда они исчезнут с экрана.Итак, вот как вы могли бы сделать это:

Создайте подкласс UITableVIew как таковой (вы должны использовать этот класс вместо TableViewController, который вы используете в данный момент, или просто добавить код, который будет позже, к вашему текущему классу TableViewController):

class HeXiaoManTableViewController:  UITableViewController {

}

В этом подклассе создайте массив (или структуру данных по вашему выбору) для хранения таймеров.Я предполагаю, что вы используете NSTimer, но это будет работать для любого класса таймера.

class HeXiaoManTableViewController:  UITableViewController {

    public var timerArray: [NSTimer] = []
}

Теперь, когда вы создаете ячейки, добавьте новый таймер в массив.Для массива я храню UITableViewCell в массиве в соответствии с его индексом.Таким образом, первый UITableViewCell (индекс 0) будет помещен в индекс 0 массива ... Но, скажем, пользователь прокручивает вверх и вниз, показывая эту первую ячейку несколько раз.Я предполагаю, что вы хотите, чтобы таймер запускался только один раз.Поэтому вам нужно проверить, существует ли таймер.Если это так, то оставьте это в покое.В противном случае добавьте таймер.Вы можете настроить его в соответствии с желаемыми функциями:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var timer = NSTimer()
    timer(timeInterval: 0.01, target: self, selector: update, userInfo: nil, repeats: false)
    if (timerArray.indices.contains(index)) {
        timerArray.insert(timer, at: index)
    }
}

Вы сможете получить доступ к этому массиву позднее, чтобы получить отдельные таймеры.Надеюсь, что это помогло!

Редактировать: изменения, внесенные в ваши классы

TimerTableViewCell.swift

import UIKit

class TimerTableViewCell: UITableViewCell {

public var timeInLabel: Int = -1
public var viewController: ViewController?
var index: Int = -1
var timer:Timer?

var tableView: UITableView? {
    var view = self.superview
    while (view != nil && view!.isKind(of: UITableView.self) == false) {
        view = view!.superview
    }
    return view as? UITableView
}

@IBOutlet weak var timerName: UILabel!
@IBOutlet weak var secondLeftLabel: UILabel!
@IBAction func stopButton(_ sender: UIButton) {

    timer?.invalidate()

}

@IBAction func playButton(_ sender: UIButton) {

    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
    RunLoop.current.add(self.timer!, forMode: RunLoopMode.commonModes)

}

@objc func updateTimer() {

    var timeInLabel = Int(secondLeftLabel.text!)!
    timeInLabel -= 1
    viewController?.timerArray[index] = timeInLabel
    secondLeftLabel.text = String(timeInLabel)

}

}

ViewController.swift

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UIGestureRecognizerDelegate {

public var timerArray: [Int] = []

var myTimerList = CustomTimerList()

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    for timer in CustomTimerList.timerList {
        timerArray.append(timer.timerSecond)
    }
    super.viewDidLoad()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return CustomTimerList.timerList.count
}

var selectedIndexArray:[Int] = []

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! TimerTableViewCell
    cell.timer?.invalidate()
    let item = CustomTimerList.timerList[indexPath.row]
    cell.timerName.text = item.timerName
    cell.secondLeftLabel.text = "\(timerArray[indexPath.row])"
    cell.index = indexPath.row
    cell.viewController = self

    return cell


}

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

Привет, когда вы dequeueReusableCell, ячейка будет использоваться повторно, что заставит ячейку обновляться, благодаря чему вы снова получаете таймер с самого начала, если меньше ячеек вы можете удалить, dequeueReusableCell или вы можетесохраняйте массив для хранения счетчика таймеров каждой ячейки.

Назначьте массив val при объявлении ячейки и обновлении в массиве приращения таймера каждой ячейки.

...