Search code examples
swiftxcodeswift4xcode12

XCode 12/Swift 4 Custom Cells not displaying on UI Table Cell View


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


Solution

  • 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.