【问题标题】:Swift tableview image from URL not showing until cell is selected来自 URL 的 Swift 表格视图图像在选择单元格之前不会显示
【发布时间】:2018-03-10 22:34:39
【问题描述】:

我正在遍历 URL 数组,以便在我的表格视图单元格中显示图像。由于某种原因,在选择单元格之前不会显示图像。一次只显示一个图像,因此当我在一个单元格上选择显示图像时,一旦我选择另一个单元格,它将再次消失。我不确定是什么问题,因为文本显示没有问题:

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "resultCell", for: indexPath) as! ResultsTableViewCell
   var place = [String]()
    var img = [String]()

    if imageUrls.count == venueIds.count {
        for (key,value) in restaurantInfo {
            place.append(value[0])
            img.append(value[1])
        }
            let search = img[indexPath.row]
            Alamofire.request(search).responseImage { response in
                if let image = response.value {
                    cell.imageSelection.image = image
                }
                else{
                    print(response.result.error!)
                }
        }
        cell.newLabel.text = place[indexPath.row]
    }
    return cell
}

【问题讨论】:

    标签: ios swift uitableview uiimage


    【解决方案1】:

    很难说没有在您的自定义单元格或 didSelectRow 方法中看到任何内容,但我猜这是因为在您的 Alamofire 请求完成之前,在您的每个单元格上都调用了 cellForRowAt

    tableView(_:cellForRowAt:) 经常被调用 - 每次单元格即将出列并出现在屏幕上时。我建议不要像 Mansi 提到的那样在这里拨打网络电话。您也可能不想在此函数中执行该循环来获取餐厅信息。每次该单元即将出列并出现在屏幕上时,将为每个单元调用循环和服务调用 - 这将很快变得非常昂贵。通过这段代码还可以看出,当表格视图的一个单元格离开屏幕然后即将再次出现在屏幕上时,该单元格将尝试重新下载图像,即使之前已经下载过(因为cellForRow 将再次调用那个单元格)。

    文本标签显示没有问题,因为它不依赖任何网络调用并且可以立即绘制。我的猜测是您的didSelectRow 或自定义单元格告诉单元格在选择时重新绘制自身,这就是为什么在您选择它时会显示该图像的原因。

    我建议将循环和请求移到这个函数之外,并创建某种数据结构来保存这些值。在等待请求完成时,您可能需要在图像视图中实现加载动画,并且图像的数据结构可以充当缓存。有几种不同的方法可以解决这个问题 - 这些只是一般性建议。祝你好运!

    【讨论】:

      【解决方案2】:

      您最好不要从 cellForRowAt 方法调用 Web 服务,而是为您的表准备一个模型并预先获取数据。

      或者

      图像获取也可以异步完成,这样您的表格滚动就不会延迟并且图像显示正确。

      DispatchQueue.main.async {}
      

      【讨论】:

      • 要事先获取数据,您是否建议在前一个控制器中执行 Web 服务请求并传递一组图像?因为我需要在加载控制器后立即加载图像
      【解决方案3】:

      不要尝试将图像添加到单元格中,而是将图像添加到您的tableView 作为cell.backgroundImage。希望能解决您的问题!

      【讨论】:

        猜你喜欢
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多