我正在尝试将一些图像设置为表格 View 中的 ImageView ,并且我将行数设置为returnkeys.count
,打印后确认为5
,这是完美的。
现在,在 cellForRowAt
中,我获取数组中的images
,然后尝试将图像设置为单元格的 ImageView 。
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCell(withIdentifier: "stockCell", for: indexPath) as! StockCell
let stock = stockData[keys[indexPath.row]]!
var images = [String]()
stock.news.forEach { images.append($0.image) }
print("\n\nNumber of Images: \(images.count)\n\n\n")
if let companyImageUrl = URL(string: images[indexPath.row]) {
ImageService.getImage(url: companyImageUrl) { (image) in
cell.companyLogoImageView.image = image
}
}
return cell
}
}
我在那里放置了一条打印语句来打印images.count
(应该是5),但是控制台显示2,然后5(x3),然后再次2 - 这导致了大概是索引超出范围错误,应该是 5 时却看到了 2:
为什么 images.count
在第一个和最后一个位置显示 2
,而在其余位置显示 5
?
编辑:其余代码
获取数据(在viewDidLoad
中):
fetchData(url: stockApiUrl) { (result: FetchResult<[String:Stock]>) -> (Void) in
switch result {
case .success(let object):
self.stockData = object
self.keys = Array(object.keys)
print("stockData: \n\n\(self.stockData)")
case .failure(let error):
print("Error decoding JSON: \n\n\(error)")
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
数据设置为字典,并使用单独的键数组:
var stockData = [String:Stock]()
var keys = [String]()
解码 JSON 的结构:
struct Welcome: Decodable {
let aapl, fb, msft, tsla, goog: Stock
enum CodingKeys: String, CodingKey {
case aapl = "AAPL"
case fb = "FB"
case msft = "MSFT"
case tsla = "TSLA"
case goog = "GOOG"
}
}
struct Stock: Decodable {
let quote: Quote
let news: [News]
}
struct Quote: Decodable {
let symbol: String
let companyName: String
let latestPrice: Double
}
struct News: Decodable {
let url: String
let image: String
}
最佳答案
添加另一个打印内容并确保每行的新闻数量也不同。然后找出为什么不同。
stock.news.forEach { images.append($0.image) }
print("\n\nNumber of Images: \(images.count)\n\n\n")
print("\n\nNumber of stock.news: \(stock.news.count)\n\n\n")
关于ios - 即使值的数量与行数匹配,索引也会超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53342835/