我已经构建了一个包含日期元素的数组。也就是说,给定当前日期,该数组是前一周和前一周的集合。
// ... UIView class properties
var dateArray = [Date]()
// ... UIView class properties
func getDate() {
// get date in raw format
let minute: TimeInterval = 60
let hour: TimeInterval = 60 * minute
let day: TimeInterval = 24 * hour
for i in -7...7 {
let date = Date(timeIntervalSinceNow: day * Double(i))
dateArray.append(date)
}
}
此数据(格式化后)将用于UICollectionViewController的背景视图中显示的视图,带有日期的pickerView。 UICollectionViewController的DataSource需要依赖于这些日期。也就是说,用户将向每个CollectionCell填充信息,即他/她当天完成的活动。选择一个新日期(在pickerview中)将意味着一个全新的默认CollectionView数据源。
我现在想要实现的是(1)根据属于所选日期的数据更新我的UICollectionViewController,以及(2)作为日期进度(在现实生活中),超出我的间隔的旧信息去不存在和新的创造。
我怀疑我将dateArray连接到我的UICollectionViewController的DataSource,并以某种方式更新它们,我只是不知道如何。
任何帮助都将非常感激,因为我无法想出实现这一点的逻辑。
答案 0 :(得分:0)
您应该始终重新计算视图即将出现的日期。然后定期运行计时器以检查日期是否已更改。当日期更改时,您重新计算日期并重新加载collectionView:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
var days: [Date] = []
var lastRefreshDate: Date?
var timer: Timer!
override func viewWillAppear(_ animated: Bool) {
refresh()
super.viewWillAppear(animated)
timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
self.refresh()
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
timer.invalidate()
}
private func refresh() {
if let date = lastRefreshDate,
Calendar.current.isDate(date, inSameDayAs: Date()){
return
}
days = (-7 ..< 8).flatMap { Calendar.current.date(byAdding: DateComponents(day: $0), to: Date())}
collectionView.reloadData()
}
}
extension ViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return days.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DateCollectionViewCell", for: indexPath) as? DateCollectionViewCell
cell.date = days[indexPath.row]
return cell
}
}