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

时间:2015-12-02 03:08:08

标签: ios iphone cocoa-touch alamofire alamofireimage

我正在使用AlamofireImage在UITmageView中的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)")
                })

这不起作用并打印" image:nil"

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

在执行af_setImageWithURL:

之前将单元格imageView设置为空图像时也可以

cell.imageView.image = UIImage()

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

2 个答案:

答案 0 :(得分:4)

这个问题已有几年历史了,但也许这个答案对于有类似问题的其他人有用,就像我之前找到正确的解决方案一样。

由于图像是异步加载的,如果我们没有为UIIMageView 提供固定的高度,我们必须在下载完成时强制更新单元格。这是因为单元更新(即AutoLayout约束重新计算)仅在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
        }

那是所有人! ; - )

答案 1 :(得分: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

                })

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