Ячейки представления коллекции не обновляются постоянно. Если вы хотите, чтобы они обновились, вы должны сказать им обновить.
Если вы хотите, чтобы в каждой ячейке отображалось различное количество оставшегося времени, вам нужна модель данных, которая сохраняет отдельный expirationDate
для каждого отображаемого indexPath. Если ваше представление коллекции представляет собой простой одномерный список элементов, например табличное представление, то вы можете просто использовать одномерный массив. Если представление вашей коллекции отображает сетку ячеек, вам может понадобиться двухмерный массив объектов модели.
Каждый раз, когда вы добавляете элемент в модель данных, включайте значение expirationDate
. (Date
, когда этот предмет истекает.)
Затем ваш таймер будет вызывать метод представления коллекции reloadData
при каждом запуске.
В вашем методе collectionView(collectionView:cellForItemAt:)
используйте indexPath, чтобы выяснить, какой элемент в вашей модели данных вы отображаете. Найдите expirationDate
для этого indexPath, рассчитайте время, оставшееся с этого момента до истечения срока действия, и отобразите эту информацию в ячейке. (Используйте метод Calendar
dateComponents(_:from:to:)
, чтобы вычислить количество часов, минут и секунд между текущей датой и датой истечения срока действия.)
EDIT
НЕ уменьшать счетчик каждый раз, когда срабатывает таймер. Посчитайте разницу между датой истечения срока и текущей датой, используя dateComponents(_:from:to:)
РЕДАКТИРОВАТЬ # 2:
Ниже приведен пример контроллера представления коллекции, который делает что-то вроде того, что вы хотите:
import UIKit
private let reuseIdentifier = "aCell"
class DatesCollectionVC: UICollectionViewController {
weak var timer: Timer?
var dates: [Date] = []
lazy var componentsFormatter: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
formatter.allowedUnits = [.hour, .minute, .second]
return formatter
}()
override func viewDidLoad() {
super.viewDidLoad()
for _ in 1...100 {
let interval = Double(arc4random_uniform( 10000)) + 120
dates.append(Date().addingTimeInterval(interval))
}
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
self.collectionView?.reloadData()
}
}
// MARK: - UICollectionViewDataSource
override func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return dates.count
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as? MyCell else {
return UICollectionViewCell()
}
let now = Date()
let expireDate = dates[indexPath.row]
guard expireDate > now else {
cell.intervalLabel.text = "00"
return cell
}
let desiredComponents: Set<Calendar.Component> = [.hour, .minute, .second]
let components = Calendar.current.dateComponents(desiredComponents, from: now, to: expireDate)
cell.intervalLabel.text = self.componentsFormatter.string(from: components)
return cell
}
}
Код выше выглядит следующим образом:
![enter image description here](https://i.stack.imgur.com/jBl8n.png)