来自 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 表格视图图像在选择单元格之前不会显示的主要内容,如果未能解决你的问题,请参考以下文章