2017-11-25 4 views
0

Ich habe ein Array gebaut, das Datumselemente enthält. Das heißt, angesichts des aktuellen Datums ist das Array eine Sammlung einer vorhergehenden Woche und einer vorhergehenden Woche.Neue Klasseninstanz für jeden Tag des Monats?

 // ... 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) 
     } 
    } 

Diese Daten (nach der Formatierung) für eine im Hintergrund Ansicht eines UICollectionViewController, ein picker mit Terminen präsentierte Ansicht verwendet werden. Die DataSource des UICollectionViewControllers muss irgendwie von diesen Daten abhängig sein. Das heißt, der Benutzer füllt jede CollectionCell mit Informationen, die Aktivität, die er/sie an diesem Tag abgeschlossen hat. Die Auswahl eines neuen Datums (in der Auswahlliste) bedeutet eine brandneue und standardmäßige CollectionView DataSource.

Was ich jetzt erreichen möchte, ist (1) aktualisieren Sie meine UICollectionViewController basierend auf den Daten, die zu dem ausgewählten Tag gehören, und (2) wie die Tage Fortschritt (im wirklichen Leben), alte Informationen, die außerhalb meines Intervalls liegt geht aus der Existenz und neue werden geschaffen.

Ich vermute, ich verbinde mein dateArray mit der DataSource meines UICollectionViewController und irgendwie aktualisieren sie ich weiß einfach nicht wie.

Jede Hilfe wird sehr geschätzt werden, da ich nicht die Logik finden kann, um dies zu implementieren.

Antwort

0

Sie sollten immer den Tag neu berechnen, an dem die Ansicht erscheinen soll. Dann führen Sie regelmäßig einen Timer aus, um zu prüfen, ob sich das Datum geändert hat. Wenn das Datum ändert Sie die Daten neu berechnen und laden Sie die Auflistung erneut:

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 
    } 
} 
+0

Vielen Dank, eine Neuberechnung des Datums, wie Sie vorschlagen sinnvoll. Ich habe bemerkt, dass ich meine Frage nicht ganz genau geschrieben habe (jetzt bearbeitet). Ich möchte, dass die DataSource vom ausgewählten Datum abhängig ist, das heißt, wenn ich das Datum ändere, ändern sich die Daten, die die Zellen füllen, an diesem bestimmten Tag. Ich vermute (1) eine Standarddatenklasse zu erstellen, (2) das Datum als Argument in Custom Init zu übergeben, um eine Abhängigkeit herzustellen, und schließlich eine Instanz dieser Datenklasse für jedes Datum in der Select-Date-Ansicht (PickerView) zu erstellen. – vas

Verwandte Themen