我正在尝试将一些图像设置为表视图中的图像视图,并且将行数设置为return keys.count
,在打印后确认为5
,这是完美的。
现在在cellForRowAt
中,我将images
放入数组中,然后尝试将图像设置为单元格的图像视图。
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-这导致索引超出范围错误大概是2,应该有5:
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
}
答案 0 :(得分:0)
添加另一份印刷品,并确保每一行的新闻数量也不同。然后找出它与众不同的原因。
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")
答案 1 :(得分:0)
您假设您有5张图片,因为keys.count
是5,这是错误的,因为keys.count
告诉您从json消息创建的字典中有5张股票。
现在每只股票都附有一个新闻数组,我假设它包含一天或类似时间与该股票相关的新闻文章/消息,因此该数组可能包含从0到无限(不太可能)数量的新闻文章。 (在这种情况下,文章数在2到5之间)。
无论如何,您在读取新闻数组时不能依靠keys.count
,而是要对每个数组进行检查news.count
。
因此需要更改此代码,但我不确定如何
if let companyImageUrl = URL(string: images[indexPath.row]) {
ImageService.getImage(url: companyImageUrl) { (image) in
cell.companyLogoImageView.image = image
}
}
您将显示所有图像吗?那么您需要以某种方式将其包围起来,但是我感觉到您只想显示一张图像,因此可以将URL(string: images[indexPath.row])
更改为URL(string: images[0])