Derrick Mu
Derrick Mu

Reputation: 68

Cells for TableView are not showing

I am trying to program a social media app and I want the posts to appear in the cells. The only things in the cell are a label for the post and a label for the topic. When I run the code there are no errors but the cells are not showing in the table. I cannot seem to figure out the problem. Thank you for your guys help.

import UIKit
import Firebase
import FirebaseDatabase
import FirebaseStorage
import FirebaseAuth
import SwiftKeychainWrapper

class FeedVC: UIViewController, UITableViewDelegate, UITableViewDataSource,     UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var postBtn: UIButton!
@IBOutlet var tableView: UITableView!

var posts = [Post]()
var post: Post!
var userName: String!

var refPosts: DatabaseReference!


override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
    //getting a reference to the node posts
    refPosts = Database.database().reference().child("posts")

    //observing the data changes
    refPosts.observe(DataEventType.value, with: { (snapshot) in

        //if the reference have some values
        if snapshot.childrenCount > 0 {

            //clearing the list
            self.posts.removeAll()

            //iterating through all the values
            for data in snapshot.children.allObjects as! [DataSnapshot] {
                //getting values
                let postObject = data.value as? [String: AnyObject]
                let id = postObject?["id"]
                let thought = postObject?["thought"]
                let likes = postObject?["likes"]

                //creating artist object with model and fetched values
                let post = Post(_id: id as! String, _thought: thought as! String?, _likes: likes as! Int?)
                //appending it to list
                self.posts.append(post)
            }

            //reloading the tableview
            self.tableView.reloadData()
        }
    })


    /*refPosts.observe(.value, with: {(snapshot) in
        if let snapshot = snapshot.children.allObjects as? [DataSnapshot] { //all objects in snapshot

            self.posts.removeAll()

            for data in snapshot {
                print(data)
                if let postDict = data.value as? Dictionary<String, AnyObject>{
                    let key = data.key
                    let post = Post(postKey: key, postData: postDict)
                    self.posts.append(post)
                }
            }
        }
        self.tableView.reloadData()
    })*/

}
func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return posts.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let post = posts[indexPath.row]
    if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell") as? PostCell{
        cell.configCell(post: post)
        return cell
    }else{
        return PostCell()
    }
}

func PostToFirebase(imgUrl: String){
    let userID = Auth.auth().currentUser?.uid

    Database.database().reference().child("users").child(userID!).observeSingleEvent(of: .value, with: { (snapshot) in
        if let data = snapshot.value as? Dictionary<String, AnyObject>{
        //if let snap = snapshot.value as? [String:Any] {
            let data = snapshot.value as! Dictionary<String, AnyObject>

            let username = data["username"]

            let post: Dictionary<String, AnyObject> = [
                "username": username as AnyObject,
                "likes": 0 as AnyObject
            ]
            let firebasePost = Database.database().reference().child("posts").childByAutoId()
            firebasePost.setValue(post)
            self.tableView.reloadData()
        }
    })
}

@IBAction func postImageTapped(_ sender: AnyObject){//leads to text field box -> What are you thinking?
    //present(imagePicker, animated: true, completion: nil)
    //performSegue(withIdentifier: "UploadPage", sender: nil)
}

@IBAction func SignOut (_ sender: AnyObject){

    try! Auth.auth().signOut()

    KeychainWrapper.standard.removeObject(forKey: "uid")

    dismiss(animated: true, completion: nil)
}
}

Upvotes: 1

Views: 59

Answers (1)

Callam
Callam

Reputation: 11539

As @vadian mentioned in the comments, forcing the cast would be fine in this scenario considering you have everything setup correctly. Try adding the print statements I have below so you can see in more detail what it happening with the cells.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let post = posts[indexPath.row]
    if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell") as? PostCell {
        print("dequeueing cell")
        cell.configCell(post: post)
        return cell
    }else{
        print("initialising cell")
        return PostCell()
    }
}

The solution involves using the newer dequeue method that takes an index path and forcing the cast.

let post = posts[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as! PostCell

cell.configCell(post: post)

return cell

Upvotes: 1

Related Questions