我遍历一系列网址,以便在我的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
}
答案 0 :(得分:0)
嘿,你不应该理想地从cellForRowAt方法调用web服务,而是为你的表准备一个模型并预先获取数据。
或者
也可以异步进行图像提取,这样您的表格滚动就不会出现滞后现象并且图像显示正确。
DispatchQueue.main.async {}
答案 1 :(得分:0)
不是尝试将图片添加到单元格,而是将图片作为tableView
添加到cell.backgroundImage
。希望能解决你的问题!
答案 2 :(得分:0)
很难说没有在您的自定义单元格或didSelectRow
方法中看到任何内容,但我的猜测是发生了这种情况,因为在您的Alamofire请求完成之前,您的每个单元格都会调用cellForRowAt
。
tableView(_:cellForRowAt:)
经常被调用 - 每次一个单元格即将出列并进入屏幕。我建议不要像曼西提到的那样在这里打网络电话。你也可能不想做这个循环来获得这个功能的餐馆信息。每次单元格即将出列并进入屏幕时,将为每个单元调用循环和服务调用 - 这将非常快速地变得非常昂贵。它还通过此代码查看,当其中一个表视图的单元格出现在屏幕上然后即将再次出现时,即使先前已经下载过,该单元格也会尝试重新下载该图像(因为cellForRow
将会调用再次为那个细胞)。
文本标签显示没有问题,因为它不依赖于任何网络调用,可以立即绘制。我的猜测是你的didSelectRow
或自定义单元格告诉单元格在选中时重新绘制自己,这就是选择它时图像显示的原因。
我建议将循环和请求移到此函数之外,并创建某种数据结构来保存这些值。您可能需要在等待请求完成时在图像视图中实现加载动画,并且图像的数据结构可以充当缓存。有几种不同的方法可以解决这个问题 - 这些只是一般性的建议。祝你好运!