0

Ok so, I am trying to make a custom table that has a news feed from newsapi, from my debugging: the api calls and such get made and the data is acessed, its just that it doesnt display on the table, it shows up as a blank table.

Here is the code: This is from the "first view controller" as I am using the tabbed template import UIKit

class FirstViewController: UIViewController, UITableViewDelegate,UITableViewDataSource {
    
    
    
    @IBOutlet weak var tableView: UITableView!
    
    var articles: [Article]? = []
    override func viewDidLoad() {
        super.viewDidLoad()
        
        fetchArticles()

    }
    func fetchArticles(){
        let urlRequest = URLRequest(url: URL(string: "https://newsapi.org/v2/top-headlines?country=us&?category=business&apiKey=sorrynotgivingmykey")!)
        
        let task = URLSession.shared.dataTask(with: urlRequest){(data,response,error) in
            
            if error != nil{
                print(error)
                return
            }
            self.articles = [Article]()
            do{
                let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]
                
                if let articlesFromJson = json["articles"] as? [[String: AnyObject]]{
                    for articlesFromJson in articlesFromJson{
                        let article = Article()
                        if let title = articlesFromJson["title"] as? String, let desc = articlesFromJson["description"] as? String, let url = articlesFromJson["url"] as? String, let imageToUrl = articlesFromJson["urlToImage"] as? String, let date = articlesFromJson["publishedAt"] as? String{
                            article.headline = title
                            article.desc = desc
                            article.url = url
                            article.imageUrl = imageToUrl
                            article.date = date
//                            print(article.date)
//                            print(article.headline)
                        }
                        self.articles?.append(article)
                    }
                }
                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
                
            }catch let error{
                print(error)
            }
            
            
        }
        
        task.resume()
//        print(articles)

    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.articles!.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "worklmao", for: indexPath) as! ArticleCell
        cell.title.text = self.articles?[indexPath.item].headline
        cell.desc.text = self.articles?[indexPath.item].desc
        cell.date.text = self.articles?[indexPath.item].date

        print("lol lmao hahax help fuck shit")
        return cell
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        1
        
    }
    
}

And this is the cell classes I used for the articles

import UIKit

class ArticleCell: UITableViewCell {

    @IBOutlet weak var date: UILabel!
    @IBOutlet weak var desc: UILabel!
    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var ImgView: UIImageView!
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

This is the article class

import UIKit

class Article: NSObject {
    var headline: String?
    var desc: String?
    var url: String?
    var date: String?
    var imageUrl: String?
}

and bare in mind I did setup the class for the cell properly(at least I thinkenter image description here

Still, this is what I get: enter image description here

  • your Empty Array declaration is not right. replace this line **var articles: [Article]? = []** with this line ***var articles: [Article]? = [Article]()*** – Imrul Kayes Sep 20 '20 at 05:59
  • 1
    No, both declarations are valid: var articles: [Article]? = [] var articles: [Article]? = [Article]() But if you skip the type declaration, then you need var articles = [Article]() which creates implicit type declaration. – claude31 Sep 20 '20 at 09:28

1 Answers1

0

Don't forget to connect dataSource and delegate for tableView.

Change your tableView outlets to this:

@IBOutlet weak var tableView: UITableView! {
   didSet {
        tableView.delegate = self
        tableView.dataSource = self
   }
}

Some points:

  1. You don't have to declare articles array as optional. Simply do this :

    var articles = [Article]()

  2. Try to learn about codables for JSON parsing.

Sharad Chauhan
  • 4,821
  • 2
  • 25
  • 50