无法在swift中将图像加载到单元格

时间:2015-07-22 10:36:30

标签: ios iphone swift uitableview ios8

我刚开始使用swift。我正在使用块和NSOperationQueue下载tableViewCell中的图像,在完成处理程序中我将返回下载的图像。我正在尝试更新单元格,如下所示。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("itemCell", forIndexPath: indexPath) as! UITableViewCell

        var itemImage = cell.viewWithTag(1000) as! UIImageView
        var itemName = cell.viewWithTag(1001) as! UILabel

        if let item = self.itemArray?[indexPath.row] {
            itemImage.image = UIImage(named: "Placeholder.jpg")
            getImageForItem(item, withCompletion: { (image) -> () in
                if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
                    var imageViewToUpdate = cellToUpdate.viewWithTag(1000) as! UIImageView
                    imageViewToUpdate.image = image
                }
            })

            itemName.text = item.itemName
            }
        return cell
    }

func getImageForItem(item: item, withCompletion completion:((image: UIImage) -> ())) {
        if let image = self.imageCache.objectForKey(item.itemID) as? UIImage {
            completion(image: image)
        } else {
            let request = item.getItemImage(ItemImageSize(rawValue: 2)!, withWidth: 100, shouldFetch: false, block: { (image, tempID) -> Void in
                if image != nil {
                    self.imageCache.setObject(image, forKey: item.itemID)

                    if item.itemID == tempID {
                        completion(image: image)
                    }
                }
            })
            if request != nil {
                imageQueue.addOperation(request)
            }
        }
    }

我面临的问题是,我在cellForRowAtIndexPath()的完成块中成功获取图像,但是,我无法更新单元格。对于上面的代码,下载的图像应用于tableView中的所有可见单元格,但是,当我向下滚动时,我只看到占位符图像。即使我将加载的图像松散到向后滚动的占位符图像。

在调试时,我发现了

if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
                    var imageViewToUpdate = cellToUpdate.viewWithTag(1000) as! UIImageView
                    imageViewToUpdate.image = image
                }
首次仅为可见单元调用

循环。但是在滚动时没有再次调用。我错过了什么?

1 个答案:

答案 0 :(得分:0)

我整理了自己。我添加了一个参数indexPath来跟踪它。

getImageForItem(item, indexPath: indexPath, withCompletion: { (image, imageIndexPath) -> () in
                if Set<NSIndexPath>(tableView.indexPathsForVisibleRows() as! [NSIndexPath]).contains(imageIndexPath) {
                    itemImage.image=image
                }
            })

这给了我完美的解决方案