11

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

cell.imageView.af_setImageWithURL(url)

图片下载后不显示。当它从内存缓存中加载时,它将第二次显示图像。

似乎使用占位符图像会有所不同。

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

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)")
                })

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

cell.imageView.image = UIImage()

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

4

2 回答 2

7

这个问题已经有几年的历史了,但也许这个答案可能对其他有类似问题的人有用,比如我之前找到正确的解决方案。

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

要强制更新单元格,我们需要使用beginUpdates()endUpdates()方法,将它们放在.af_setImage(). 这样,每次下载完成时,都会更新单元格。

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

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

作为附带好处,单元格高度将自动调整(请记住 在您的方法中放置tableView.estimatedRowHeight = 400和)tableView.rowHeight = UITableViewAutomaticDimensionviewDidLoad()

最后,这里是代码:

    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
        }

这就是所有的人!;-)

于 2017-06-09T09:58:55.623 回答
1

您可以通过添加 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 存在问题。当我在浏览器中打开它时,它正在下载图像。

于 2016-03-18T13:35:17.760 回答