Jake2Finn
Jake2Finn

Reputation: 536

Table empty when populating cells from json

I am trying to populate a table with json content. Everything seems to work fine except that the table is not showing any data. Actually, the code shown below should display the "title" information of each json data array into one cell. See line

cell.textLabel?.text = myNewsItems[indexPath.row].title

However, from what I can see in the console output, I can verify that the news array is parsed like expected (see Checkpoint: print(myNewsS)).

Any idea what I am missing?

Swift4

import UIKit

// structure from json file
struct News: Codable{
    let type: String
    let timestamp: String
    let title: String
    let message: String
}

class HomeVC: UIViewController, UITableViewDelegate, UITableViewDataSource{
    var myTableView = UITableView()
    var myNewsItems: [News] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        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: 150, width: displayWidth, height: displayHeight - barHeight))
        myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        myTableView.dataSource = self
        myTableView.delegate = self
        self.view.addSubview(myTableView)

        // JSON

        let url=URL(string:"https://api.myjson.com/bins/ywv0k")
        let session = URLSession.shared
        let task = session.dataTask(with: url!) { (data, response, error) in

            // check status 200 OK etc.

            guard let data = data else { return }

            do {
                let myNewsS = try
                    JSONDecoder().decode([News].self, from: data)
                print(myNewsS)

                DispatchQueue.main.async {
                    self.myTableView.reloadData()
                }

            } catch let jsonErr {
                print("Error json:", jsonErr)
            }

        }
        task.resume()
    }

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

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


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = myNewsItems[indexPath.row].title
        return cell
    }
}

Upvotes: 0

Views: 145

Answers (1)

Shehata Gamal
Shehata Gamal

Reputation: 100523

Assign the array

myNewsItems = myNewsS 
DispatchQueue.main.async {
    self.myTableView.reloadData()
}

Upvotes: 2

Related Questions