简体   繁体   English

Firebase + Swift TableView按日期排序

[英]Firebase + Swift TableView Sorted by Dates

I am fairly new to realm of coding and I know this question might have been answered similarly elsewhere but when it comes to Firebase it may not. 我对编码领域还很陌生,我知道这个问题可能在其他地方也有类似的回答,但是当涉及到Firebase时,可能就没有。 I was following this answer ( Adding sections, separated by dates, to UITableView in Swift ) but encounters complication when I implement .ChildAdded and insertRowAtIndexPath. 我一直在关注这个答案( 在Swift中向UITableView中添加按日期分隔的部分 ),但是在实现.ChildAdded和insertRowAtIndexPath时遇到了麻烦。 My code as follows: 我的代码如下:

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

I know there are many errors here, is there anyone who can direct me accordingly? 我知道这里有很多错误,有人可以据此指导我吗? All the async nature of Firebase just complicates the flow for me. Firebase的所有异步特性对我来说都使流程复杂化。

try this . 尝试这个 。 Change below code from 从以下代码更改

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

to

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM