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

Posted

技术标签:

【中文标题】Swift 5:从 tableView numberOfRowsInSection 返回数组计数时索引超出范围【英文标题】:Swift 5: index out of range when returning the array count from tableView numberOfRowsInSection 【发布时间】:2019-06-09 15:17:30 【问题描述】:

我几乎解决了这个问题。这是唯一需要解决的问题。

这就是我要解析的内容: https://newsapi.org/v2/top-headlines?country=us&category=business&apiKey=API_KEY

sample[0].articles.count 出现索引超出范围的错误

我正在尝试使用我解析的数据填充标签。我试过了,它只返回 1 个单元格。

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

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
    



【问题讨论】:

我觉得这与您将sample 制作为News 对象的数组有关,但News 应该(可能)只是一个对象,因为它具有@987654327 的数组@s. 【参考方案1】:

您正在异步设置 sampletableView(_ tableView: UITableView, numberOfRowsInSection section: Int)sample 包含任何内容之前被调用。 以下更改将防止崩溃。

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

【讨论】:

return sample.first?.articles.count ?? 0

以上是关于Swift 5:从 tableView numberOfRowsInSection 返回数组计数时索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

调用 array.removeAll() 后 tableview.reload 不起作用 swift 5

当我尝试重新加载日期时,Swift 5 TableView 在 ViewController 中发现 nil

多次重新加载 TableView Swift

Swift,Tableview 应该从下面开始

Json数据未显示在tableView swift 5上

在swift 5中将json数据获取到tableview