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

时间:2018-03-10 22:34:40

标签: ios swift uitableview uiimage

我遍历一系列网址,以便在我的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 个答案:

答案 0 :(得分:0)

嘿,你不应该理想地从cellForRowAt方法调用web服务,而是为你的表准备一个模型并预先获取数据。

或者

也可以异步进行图像提取,这样您的表格滚动就不会出现滞后现象并且图像显示正确。

DispatchQueue.main.async {}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

tableView(_:cellForRowAt:)经常被调用 - 每次一个单元格即将出列并进入屏幕。我建议不要像曼西提到的那样在这里打网络电话。你也可能不想做这个循环来获得这个功能的餐馆信息。每次单元格即将出列并进入屏幕时,将为每个单元调用循环和服务调用 - 这将非常快速地变得非常昂贵。它还通过此代码查看,当其中一个表视图的单元格出现在屏幕上然后即将再次出现时,即使先前已经下载过,该单元格也会尝试重新下载该图像(因为cellForRow将会调用再次为那个细胞)。

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

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