AlamofireImage af_setImageWithURL在没有占位符图像的UITableViewCell中

我使用AlamofireImage在UITableViewCell中的UIImageView上设置图像,如下所示:

cell.imageView.af_setImageWithURL(url)

下载后不显示图像。 它将在从内存caching中加载的第二次显示图像。

看来,使用占位符图像使所有的差异。

这工作并打印(下载)图像的地址:

 cell.imageView.af_setImageWithURL(URL, placeholderImage: UIImage(named: "placeholder"), filter: nil, imageTransition: .None, completion: { (response) -> Void in print("image: \(cell.imageView.image)") }) 

这不起作用,并打印“图像:无”

 cell.imageView.af_setImageWithURL(URL, placeholderImage: nil, filter: nil, imageTransition: .None, completion: { (response) -> Void in print("image: \(self.image)") }) 

在执行af_setImageWithURL:之前,将单元格af_setImageWithURL:设置为空的图像也可以工作af_setImageWithURL:

cell.imageView.image = UIImage()

这是UITableViewCell,AlamofireImage中的错误还是我做错了什么?

您可以通过添加2行代码来打印错误,以便您获得有关该问题的更多想法。

 cell.imageView.af_setImageWithURL(URL, placeholderImage: UIImage(named: "placeholder"), filter: nil, imageTransition: .None, completion: { (response) -> Void in print("image: \(cell.imageView.image)") print(response.result.value) //# UIImage print(response.result.error) //# NSError }) 

在我的情况下,图片url存在问题。 当我在浏览器中打开它时,它正在下载图像。

这个问题已经有几年了,但也许这个答案可能对其他有类似问题的人有用,就像我之前find正确的解决scheme一样。

由于图像是asynchronous加载的,如果我们没有为UIIMageView提供固定的高度, 我们必须在下载完成时强制更新单元格 。 这是因为单元格更新(即AutoLayout约束重新计算)仅在cellForRowAt方法后自动完成,这是在第一次显示单元格时调用的,或者是在滚动表格以显示其他单元格时调用的。 在这两种情况下,可能图像还没有被af_setImage()方法下载,所以只有占位符将被显示,因为它们的大小暂时是未知的。

为了强制更新单元格,我们需要使用beginUpdates()endUpdates()方法,将它们放在.af_setImage()的完成句柄中。 这样,每次下载完成,单元格将被更新。

但是,为了避免循环 ,在调用beginUpdates() / endUpdates()之前,我们必须先检查是否已经更新了单元格,因为通过调用这些方法, cellForRowAt方法被再次调用,因此af_setImage()及其用beginUpdates() / endUpdates()里面的完成closures)。

这意味着我们必须在下载完成后更新单元格,而不是在图像已经被兑现时 (因为如果是兑现的话,意味着我们已经更新了单元格)。 这可以通过检查完成处理程序的响应来完成:如果它不是nil ,那么图像只是向下倾斜,如果是nil ,则图像被兑现。

作为一个副作用,单元格高度将被自动调整(记得在你的viewDidLoad()方法中放置tableView.estimatedRowHeight = 400tableView.rowHeight = UITableViewAutomaticDimension

最后,这里是代码:

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Dequeue your cell let cell = self.tableView.dequeueReusableCell(withIdentifier: "YourCustomCellIdentifier") as! YourCustomTableViewCell // get picture url from the data array let pictureUrl = self.yourCellsData[indexPath.row].pictureUrl // async download cell.pictureView.af_setImage( withURL: URL(string: pictureUrl)!, placeholderImage: UIImage(named: "YourPlaceholder.png"), filter: nil, imageTransition: UIImageView.ImageTransition.crossDissolve(0.5), runImageTransitionIfCached: false) { // Completion closure response in // Check if the image isn't already cached if response.response != nil { // Force the cell update self.tableView.beginUpdates() self.tableView.endUpdates() } } return cell } 

这就是所有人! 😉