Несколько таймеров в Tableview Swift - PullRequest
0 голосов
/ 05 июня 2019

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

Время запуска установлено на 100 единиц (не важно для вопроса), и оно должно вести обратный отсчет.

При добавлении новой строки будет запущен собственный таймер и будет отображаться значение в этой новой строке.

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

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

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ:

Dequeue issue

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

Здесь - суть, которую я использовал для скриншота выше

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Вот как вы можете обрабатывать timers в каждом UITableViewCell.

Создать пользовательский UITableViewCell

class CustomCell: UITableViewCell {
    //MARK: Outlets
    @IBOutlet weak var label: UILabel!

    //MARK: Internal Properties
    var handler: ((Int)->())?

    //MARK: Private Properties
    private var timer: Timer?
    private var counter = 100 {
        didSet {
            DispatchQueue.main.async {
                self.label.text = "\(self.counter)"
                self.handler?(self.counter)
            }
        }
    }

    //MARK: Internal Methods
    func configure(with counter: Int) {
        self.counter = counter
        self.setTimer()
    }

    //MARK: Private Methods
    private func setTimer() {
        self.timer?.invalidate()
        self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: {[weak self] (timer) in
            if let counter = self?.counter, counter > 0 {
                self?.counter -= 1
            } else {
                timer.invalidate()
            }
        })
    }
}

В приведенном выше коде:

  1. Я создал label, который будет обновлять значение counter в UI.
  2. handler - он будет хранить и сохранять обновленное значение counterгде-то (в ViewController, объяснено далее), когда cell перемещен за пределы экрана
  3. timer - запланируйте timer в cell с timeinterval = 1
  4. counter - текущее counter значение для каждого cell

В ViewController,

class VC: UIViewController, UITableViewDataSource {
    let numberOfCells = 20
    var timerArr = [Int]()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.timerArr = [Int](repeating: 100, count: numberOfCells)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.numberOfCells
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell
        cell.configure(with: self.timerArr[indexPath.row])
        cell.handler = {[weak self] (counter) in
            self?.timerArr[indexPath.row] = counter
        }
        return cell
    }
}

В приведенном выше коде,

  1. timerArr - отслеживает значение counter для каждого cell в tableView.
  2. В tableView(_:cellForRowAt:), counter для каждого cell обновляется с помощью handler, который мы создали ранее в CustomCell.
0 голосов
/ 05 июня 2019

Я бы использовал один таймер для всех ячеек. При создании объекта и добавлении его в источник данных запишите dateAdded = Date (), затем, когда ячейки будут перестроены при срабатывании таймера, получите счетчик секунд для каждой ячейки из поля dateAdded и обновите ячейку в cellForRowAtIndex.

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