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】:
您正在异步设置 sample
,tableView(_ 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