SwiftLove
SwiftLove

Reputation: 33

I can't print to TableView data with Swift JSON

I'm new to using JSON and wanted to start with a simple app to provide an overview of the movie. The following code does not print anything on the tableView, the app remains empty, with no results. He makes no mistakes. In the debug area, however, the data prints them to me. How can I get the results on the tableView?

ViewController.swift

import UIKit


class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var popularMoviesArray = [Results]()
    var swiftManager = SwiftManager()
    var tableViewCell = TableViewCell()

    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var labelError: UILabel!
    
    
   override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self

        swiftManager.delegate = self
    
    swiftManager.fetchUrl()

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

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

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell

        let item = popularMoviesArray[indexPath.row]
        
        cell.labelTitle.text = item.title
        cell.labelYear.text = item.release_date
        cell.labelRate.text = String(item.vote_average ?? 0.0)
        cell.labelOreview.text = item.overview
        
        return cell
        
    }
    
    
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        performSegue(withIdentifier: "goToDetail", sender: indexPath.row)
    }
    
 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        guard segue.identifier != nil else {
            return
        }
        
       let letRow = sender as? Int
        
        switch segue.identifier {
        case "goToDetail":
        (segue.destination as! ViewControllerDetail).itemDetail = popularMoviesArray[letRow!]
        
        default:
            return
        }
        
    }



}



extension ViewController: SwiftManagerDelegate {
    
func didUpdateStruct(_ swiftManager: SwiftManager, swiftData: SwiftData) {

        DispatchQueue.main.async {
            self.popularMoviesArray = swiftData.results
            print("PRINT ARRAY - \(self.popularMoviesArray)")
        }
        
    }
    

    func didFailWithError(error: Error) {
        print(error)
    }
    
}

Upvotes: 0

Views: 58

Answers (1)

vadian
vadian

Reputation: 285074

You have to reload the table view in the delegate method because the data is loaded asynchronously

func didUpdateStruct(_ swiftManager: SwiftManager, swiftData: SwiftData) {

    DispatchQueue.main.async {
        self.popularMoviesArray = swiftData.results
        self.tableView.reloadData()
        print("PRINT ARRAY - \(self.popularMoviesArray)")
    }
    
}

Reloading the table view in viewDidLoad is pointless.

Upvotes: 2

Related Questions