简体   繁体   English

Swift 5:从tableView numberOfRowsInSection返回数组计数时索引超出范围

[英]Swift 5: index out of range when returning the array count from tableView numberOfRowsInSection

I'm almost done with this problem. 我几乎已经解决了这个问题。 This is the only thing left to solve. 这是唯一剩下要解决的问题。

this is what I am trying to parse: https://newsapi.org/v2/top-headlines?country=us&category=business&apiKey=API_KEY 这就是我要解析的内容: https : //newsapi.org/v2/top-headlines? country = us & category = business & apiKey =API_KEY

sample[0].articles.count have an error of index out of range sample [0] .articles.count的索引错误超出范围

I'm trying to populate the labels with the data I parsed. 我正在尝试用我解析的数据填充标签。 I tried this and it's only returning 1 cell. 我试过了,它只返回1个单元格。

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

ViewController.swift ViewController.swift

import UIKit

struct News: Decodable {

    let articles: [Article]

    struct Article: Decodable {
        let title: String?
        let urlToImage: String?
        let description: String?
    }
}
class ViewController: UIViewController {

    @IBOutlet weak var table: UITableView!

    var sample = [News]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        getJson()

        table.delegate = self
        table.dataSource = self

    }

    func getJson() {
        let urlString = "https://newsapi.org/v2/top-headlines?country=us&category=business&apiKey=e07d26ea273d41e2af174b026aea27b5"

        guard let url = URL(string: urlString) else { return }

        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }

            do {
                self.sample = [try JSONDecoder().decode(News.self, from: data)]
                print(self.sample[0].articles.count)
                for dict in self.sample {
                    for sam in dict.articles {
                        print(sam.title!)
                    }
                }

                DispatchQueue.main.async {
                    //reload tableView data
                    self.table.reloadData()
                }

            } catch let jsonErr {
                print("json error: ", jsonErr)
            }
        }.resume()
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sample[0].articles.count
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return CGFloat(100)
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell") as! TableViewCell
        let json = sample[0].articles[indexPath.row]
        cell.name.text = "\(json.title!)"
        cell.link.text = "\(json.description!)"
        cell.imageUrl.text = "\(json.urlToImage!)"
        return cell
    }


}

You are setting sample asynchronously, tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) is called before sample contains anything. 您正在异步设置sample ,在sample包含任何内容之前,将调用tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) The following change will prevent the crash. 以下更改将防止崩溃。

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sample.first?.articles.count ?? 0
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM