Таймеры не обновляются в UITableView iOS - PullRequest
0 голосов
/ 08 марта 2019

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

TableView с таймером обратного отсчета

Если я использую следующий код для простой метки в контроллере, все работает нормально.

var duration = 0.0
func clock(){
    Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self](Timer) in
            guard let strongSelf = self else { return }
            strongSelf.duration -= 0.01
            let formatter = DateComponentsFormatter()
            formatter.unitsStyle = .positional
            formatter.allowedUnits = [.hour,.minute,.second]
            formatter.zeroFormattingBehavior = .pad
            strongSelf.timerLabel.text = formatter.string(from: strongSelf.duration)
        })
    }

Но если я напишу аналогично для tableViewCell, это только покажет значения, но не обновит их.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier:"myTimer", for: indexPath) as? UITableViewCell
        let label = cell?.contentView.viewWithTag(13) as? UILabel
        milisecondsClock(index: indexPath.row, label: label!)
        return cell!
    }

    func milisecondsClock(index: Int,label: UILabel){
        Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { [weak self](Timer) in

            guard let strongSelf = self else { return }
            strongSelf.myList[index] -= 0.01
            let formatter = DateComponentsFormatter()
            formatter.unitsStyle = .positional
            formatter.allowedUnits = [.hour,.minute,.second]
            formatter.zeroFormattingBehavior = .pad
            label.text = formatter.string(from: strongSelf.myList[index])
        })
    }

Как показать таймер в виде таблицы с обратным отсчетом в реальном времени?

1 Ответ

0 голосов
/ 08 марта 2019

Ячейки таблицы не обновляются, поскольку таймеры, созданные в millisecondsClock, не имеют объекта-владельца и безвозвратно удаляются ARC.Вы должны хранить свои таймеры в контроллере вида так же, как вы храните myList.Вы можете найти больше информации о ARC в https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

. Вы также не должны передавать UILabel в millisecondsClock метод, потому что ячейки повторно используются UITableView.Это означает, что одна и та же ячейка и UILabel внутри этой ячейки могут использоваться несколько раз для визуализации константы с разными путями индекса.В вашем случае это означает, что несколько таймеров могут одновременно обновлять одну и ту же метку.Я думаю, вы должны использовать func cellForRow(at indexPath: IndexPath) -> UITableViewCell? внутри блока таймера, чтобы получить правильную ячейку для обновления времени.

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