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

Posted

技术标签:

【中文标题】来自 URL 的 Swift 表格视图图像在选择单元格之前不会显示【英文标题】:Swift tableview image from URL not showing until cell is selected 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

或者

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

DispatchQueue.main.async 

【讨论】:

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

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

【讨论】:

以上是关于来自 URL 的 Swift 表格视图图像在选择单元格之前不会显示的主要内容,如果未能解决你的问题,请参考以下文章

在表格视图单元格中添加集合视图 swift 3

Swift4:来自 URL 的 UIImage

来自 CKAsset 的图像在 Swift 中乱序加载

图像选择器崩溃 - iOS Swift

swift:来自firebase的照片未显示在表格视图中

带有透明单元格并显示背景图像的 Swift 表格视图