0

If I use the static array that has the basic strings in it, I can render those out to the UITableView, BUT when I build my "jokes" array and use that for the datasource for the table cells, I just get empty list in UI. Rows output, but no data.

I'm sure it's something simple, still new to Swift (.net background).

Why are the "jokes" array items not displaying in the tableViewCell?

import UIKit
import Firebase

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


var dict : [String: AnyObject] = [:]
var jokes = [Jokes]()

private let myArray: NSArray = ["First","Second","Third"]
private var myTableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()

    var ref = Database.database().reference()
            ref.observe(.value, with: { (snapshot) in
                for child in snapshot.children { //even though there is only 1 child
                    let snap = child as! DataSnapshot
                    //                let dict = snap.value as? NSDictionary
                    self.dict = snap.value as! [String: AnyObject]
                    for (joke, item) in self.dict ?? [:] {
                        let myJokeCollection = Jokes(fromDict: item as! [String : AnyObject]); //This has object from Dictionary retrieved from firebase
                        self.jokes.append(myJokeCollection)
                        print(myJokeCollection) //This prints collection
                        print(myJokeCollection.postUser) // this prints the "post user"

                    }


                }
            })

    //Below is intial example

    let barHeight: CGFloat = UIApplication.shared.statusBarFrame.size.height
    let displayWidth: CGFloat = self.view.frame.width
    let displayHeight: CGFloat = self.view.frame.height

    myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight))
    myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "JokeCell")
    myTableView.dataSource = self
    myTableView.delegate = self
    self.view.addSubview(myTableView)
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("Num: \(indexPath.row)")
//        print("Value: \(myArray[indexPath.row])") <- THis works as it's declared at the top of class
    print("Value: \(jokes[indexPath.row])") //THis prints nothing (of course)
 }

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

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "JokeCell", for: indexPath as IndexPath)
 //If I use reference to myArray below it prints those items, but not from mine "jokes"
    cell.textLabel!.text = "\(jokes[indexPath.row])"
    return cell
}

}
class Jokes {
var postUser: String?
var punchline: String?
var rating: Int?
var setup: String?

init(fromDict dict:[String: AnyObject]) {
    self.postUser = dict["PostUser"] as? String
    self.punchline = dict["Punchline"] as? String
    self.rating = dict["Rating"] as? Int
    self.setup = dict["Setup"] as? String

}
}

2 Answers 2

1

All your code is correct just make sure you add tableView.reloadData()

After this line

print(myJokeCollection.postUser)
tableView.reloadData()

Why is this needed?

This is needed to reload the tableView after you have added new data, the tableView is automatically loaded when the view launches but when you add new data you must call this to tell the tableView, "Oh, I've got new data! Time to reload!"

Sign up to request clarification or add additional context in comments.

Comments

1

Though @OkiRules answer is correct i would like to correct one thing and that is do not reload data in loop it just increases processing time and keeps UI more busy. Reload data out of loop, Do it like below.

for (joke, item) in self.dict ?? [:] {
                        let myJokeCollection = Jokes(fromDict: item as! [String : AnyObject]); //This has object from Dictionary retrieved from firebase
                        self.jokes.append(myJokeCollection)
                        print(myJokeCollection) //This prints collection
                        print(myJokeCollection.postUser) // this prints the "post user"

                    }
    tableView.reloadData()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.