Swift 来自 URL 的表格视图图像在选择单元格之前不会显示

Swift tableview image from URL not showing until cell is selected

我正在遍历一组 URL,以便在我的表格视图单元格中显示图像。出于某种原因,在单元格 selected 之前,图像不会显示。一次只能显示一张图像,所以当我 select 在一个单元格上显示图像时,一旦我 select 另一个单元格,它就会再次消失。我不确定问题出在哪里,因为显示的文本没有任何问题:

  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
}

嘿,理想情况下,您不应该从 cellForRowAt 方法调用 Web 服务,而是为您的 table 准备一个模型并预先获取数据。

图片获取也可以异步完成,这样您的 table 的滚动就不会变得迟缓并且图片可以正确显示。

DispatchQueue.main.async {}

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

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

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

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

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