Jan Swoboda
Jan Swoboda

Reputation: 172

How to Sort TableViewCells by date string

As shown below I want to sort my TableViewCells by the date. For this I have the time which is also called timestampName.

Right before I reload the data, I tried to sort it, but somehow this has no effect. It also throws me a warning, that I dont use the result of the sorted by. I understand this, but I dont know how to fix that.

import UIKit
import Firebase

class popularViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    @IBOutlet var table: UITableView!

//    var models = [PhotoPost]()
    var texttt = [TextPost]()

    override func viewDidLoad() {
        super.viewDidLoad()
        gettingPosts()
        table.register(popularTableViewCell.nib(), forCellReuseIdentifier: popularTableViewCell.identifier)
        table.register(featuredTableViewCell.nib(), forCellReuseIdentifier: featuredTableViewCell.identifier)
        table.register(textTableViewCell.nib(), forCellReuseIdentifier: textTableViewCell.identifier)

        table.delegate = self
        table.dataSource = self
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return texttt.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: textTableViewCell.identifier, for: indexPath) as! textTableViewCell
        cell.configure(with: self.texttt[indexPath.row])
        return cell

    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        return 300
    }

    func gettingPosts(){

        let db = Firestore.firestore()
        let postsRef = db.collection("posts")
        postsRef.addSnapshotListener { (querySnapshot, error) in
            guard let snapshot = querySnapshot else {
            print("Error fetching snapshots: \(error!)")
            return
            }
            snapshot.documentChanges.forEach { diff in
                if (diff.type == .added){
                    let data = diff.document.data()
                    let Name = data["username"] as! String
                    let text = data["description"] as! String
                    let likes = data["likes"] as! Int
                    let typ = data["postType"] as! Int
                    let pfp = data["profileImage"] as! String
                    let uid = data["uid"] as! String
                    let pic = data["picture"]
                    let time = data["time"] as! String

                    if typ == 0{                                                // Text post
                        let dasDing = TextPost(numberOfComments: 0, username: Name, timestampName: time, userImageName: pfp, textName: text)
                        self.texttt.append(dasDing)
                        self.texttt.sorted(by: { $0.timestampName < $1.timestampName }) //WARNING: Result of call to 'sorted(by:)' is unused
                        self.table.reloadData()
                    }

struct TextPost {
    let numberOfComments: Int
    let username: String
    let timestampName: String
    let userImageName: String
    let textName: String
}

Upvotes: 0

Views: 179

Answers (1)

Claudio
Claudio

Reputation: 5203

Use sort instead of sorted. The sorted method returns a new sorted array, on the other hand, the sort method sorts the array on which it was called.

self.texttt.sort(by: { $0.timestampName < $1.timestampName })

This should also work, using sorted:

self.texttt = self.texttt.sorted(by: { $0.timestampName < $1.timestampName })

Upvotes: 2

Related Questions