2016-09-25 5 views
0

Ich bin ziemlich neu in der Welt der Codierung und ich weiß, dass diese Frage möglicherweise anderswo anders beantwortet wurde, aber wenn es um Firebase geht, kann es nicht. Ich folgte dieser Antwort (Adding sections, separated by dates, to UITableView in Swift), begegnet jedoch Komplikation, wenn ich .ChildAdded und insertRowAtIndexPath implementiere. Mein Code wie folgt:Firebase + Swift TableView Nach Daten sortiert

var ref: FIRDatabaseReference! 
var mileageDatabase: [FIRDataSnapshot]! = [] 
var retrieveDates: [(String)] = [] 
var uniqueDates: [(String)] = [] 

struct tripDataset { 
    let date: String 
    let purpose: String 
} 
var tripItems = Dictionary<String, Array<tripDataset>>() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.tableView = UITableView(frame: self.tableView.frame, style: .Grouped) 

    let nib = UINib(nibName: "TripTableViewCell", bundle: nil) 
    self.tableView.registerNib(nib, forCellReuseIdentifier: "cell") 
    configureDatabase() 

} 

func configureDatabase() { 
    self.ref = FIRDatabase.database().reference() 
    if let user = FIRAuth.auth()?.currentUser { 
     self.ref.child("mileage").queryOrderedByChild("user").queryEqualToValue(user.uid).observeEventType(.ChildAdded, withBlock: { (snapshot) in 
      self.mileageDatabase.insert(snapshot, atIndex: 0) 

      let snapValues = snapshot.value as! Dictionary< String, AnyObject> 
      let snapDates = snapValues["date"] as! String 
      let snapPurpose = snapValues["purpose"] as! String 

      self.retrieveDates.append(snapValues["date"] as! String) 
      self.uniqueDates = Array(Set(self.retrieveDates)) 

      if self.tripItems.indexForKey(snapDates) == nil { 
       self.tripItems[snapDates] = [tripDataset(date: snapDates, purpose: snapPurpose)] 
      } else { 
       self.tripItems[snapDates]!.append(tripDataset(date: snapDates, purpose: snapPurpose)) 
      } 

      self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: .Automatic) //Stuck hereeee..... 

     }) 
    }   
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return self.uniqueDates.count 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.tripItems[section].count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TripTableViewCell 

    cell.dateTimeLabel.text = self.uniqueDates(indexPath.section) 
    cell.purposeLabel.text = self.tripItem[self.uniqueDates(indexPath.section)]["purpose"] 

    return cell 
} 

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
return self.uniqueDates(section) 
} 

Ich weiß, es gibt viele Fehler hier, gibt es jemanden, der mich entsprechend leiten kann? All die asynchrone Natur von Firebase erschwert nur den Fluss für mich.

+0

Was sind die Probleme und was wollen Sie tun ..? – Dravidian

+0

@Dravidian Tabelle sortieren nach Daten, wobei jeder Tag ein Abschnitt selbst ist. Die Idee ist, alle Reisen innerhalb eines Tages in einem Abschnitt zu gruppieren. – Koh

Antwort

0

versuchen Sie dies. ändern Code unten aus

self.retrieveDates.append(snapValues["date"] as! String) 

zu

self.retrieveDates.insert(snapValues, at : 0)