ios - 即使值的数量与行数匹配,索引也会超出范围错误

标签 ios swift uitableview

我正在尝试将一些图像设置为表格 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:

enter image description here

为什么 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/

相关文章:

objective-c - Game Center 不响应 authenticateWithCompletionHandler 请求 (iOS)

ios - 将音频修剪为视频长度

ios - 如何检测单元格是否添加角标(Badge)?

java - 如何从 javaFx 中同一数据库中的两个 mysql 表填充 TableView ?

ios - 无法在 XCode Objective C 上设置 UITableView 框架

ios - 如何在后台 iOS Swift 中播放实时流中的音频

javascript - 在 UIWebView 上使用 Javascript 获取特定 div 类的所有内容

swift - 如何将 View Controller 呈现为 View 的一部分?

swift - 使用窗口 ID 激活窗口

ios - UITableView 加边框也在 HeaderView 上加边框