代码之家  ›  专栏  ›  技术社区  ›  matteo94

选定单元格后,URL中的Swift tableview图像才会显示

  •  0
  • matteo94  · 技术社区  · 8 年前

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

      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
    }
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   mattjj    8 年前

    很难说在你的自定义单元格或 didSelectRow 方法,但我猜这是因为 cellForRowAt 在Alamofire请求完成之前,正在调用每个单元格。

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

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

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

        2
  •  0
  •   Mansi    8 年前

    嘿,理想情况下,您不应该从cellForRowAt方法调用web服务,而应该为表准备一个模型并提前获取数据。

    或

    此外,还可以异步执行图像获取,这样您的表的滚动就不会出现延迟,图像也会正确显示。

    DispatchQueue.main.async {}
    
        3
  •  0
  •   Noah Wilder    8 年前

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

    推荐文章