2016-12-22 4 views
0

У меня есть UITableView, где каждая ячейка имеет метку. Когда в ячейке нажата кнопка, мне нужно обновить метку для каждой ячейки каждые 0,01 миллисекунды.Когда таймер запущен для каждого UITableViewCell, они не перерабатываются должным образом

func tick(label: UILabel) { 
    let timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { (timer) in 
     // functionality to decide what to put in the label goes here 
     label.text = "some string" 
    } 
} 


// button action 
@IBAction func startButtonPressed(_ sender: UIButton) { 
    let buttonPostion = sender.convert(CGPoint.zero, to: tableView) 

    if let indexPath = tableView.indexPathForRow(at: buttonPostion), let cell = tableView.cellForRow(at: indexPath) as? CustomCell { 
     tick(label: cell.label) 
    } 
} 

Проблема заключается в том, что при прокрутке UITableView ячейки не возвращаются должным образом. Например, если я нажимаю кнопку «Пуск» на ячейке вверху, таймер начинает работать, и его метка начнет меняться, тогда, если я прокручу вниз ярлык для другой ячейки, она также будет меняться идентично ячейке вверху, без его таймер запускается.

Каков наилучший способ решить эту проблему?

+0

В качестве альтернативы ответу @Tom Harrington я предлагаю подключить таймеры к источнику данных. –

ответ

1

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

Если вы собираетесь хранить таймер в ячейке, вам необходимо организовать остановку и перезапуск таймеров при повторном использовании ячеек. Вы можете остановить таймер, переопределив prepareForReuse в своем классе ячейки ячейки, чтобы никогда не было запущенного таймера, когда ячейка повторно используется. Чтобы перезапустить их, вам необходимо, чтобы ваш источник данных в виде таблицы отслеживал, какие ячейки имеют таймеры, чтобы вы могли запустить таймер при удалении ячейки.

 Смежные вопросы

  • Нет связанных вопросов^_^