图像在UITableViewCell中不按顺序显示

时间:2016-06-29 13:48:57

标签: ios swift uitableview swift2 nsxmlparser

我正在尝试将图像从XML enclosure显示到tableViewCell图像。由于dequeueReusableCellWithIdentifier,图像显示但不是按顺序显示,因为当我向上和向下滚动tableViewCell时,它会根据array index更改图像而不按顺序显示。我尝试了不同的方法,但没有取得成功 任何人都可以告诉我如何按顺序显示图像,或者是否有任何方式首先下载所有图像,然后显示在单元格图像? 或者使用dispatch_async代替任何其他快速或简单的方法。 谢谢

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell : ImageCell2 = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ImageCell2

        cell.titleLabel.text = posts.objectAtIndex(indexPath.row).valueForKey("title") as! NSString as String

        downloadFileFromURL(NSURL(string: self.posts.objectAtIndex(indexPath.row).valueForKey("enclosure") as! String)!, completionHandler:{(img) in
            dispatch_async(dispatch_get_main_queue(), { () -> Void in

                cell.sideImageView.image = img

                })
            })

        return cell

    }
  

更新

现在我尝试了这个

let picURL = self.posts.objectAtIndex(indexPath.row).valueForKey("enclosure") as! String
let url = NSURL(string: picURL)
let data = NSData(contentsOfURL: url!)

cell.sideImageView?.image = UIImage(data: data!)

它按顺序显示图像但是难以滚动?

  

UPDATE2

现在我试过这个

var check = true
var imageArrayNsData : [NSData] = []

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell : ImageCell2 = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ImageCell2

cell.titleLabel.text = posts.objectAtIndex(indexPath.row).valueForKey("title") as! NSString as String

if check == true{
            var indeX = 0
            for i in posts.valueForKey("enclosure") as! [NSString]{
                let picURL = self.posts.objectAtIndex(indeX).valueForKey("enclosure") as! String
                let url = NSURL(string: picURL)
                let data = NSData(contentsOfURL: url!)
                print("download")
                imageArrayNsData.append(data!)
                indeX++
                print(indeX)
            }
            check = false
        }

if check == false{
        cell.sideImageView.image = UIImage(data: imageArrayNsData[indexPath.row])
    }
return cell

}

此方法仅下载图像一次。下载图像后,它会附加到数组中,下次它会显示数组中的图像而无需再次下载。但这种方法对于滚动来说有点困难。任何人都知道为什么?

2 个答案:

答案 0 :(得分:1)

问题是,在设置图像时,cell对象可能已经被重用。您需要添加一项检查以确保单元格仍然代表您想要的内容。这可能很简单:

if tableView.indexPathForCell(cell) == indexPath {
    cell.sideImageView.image = img
}

但是如果特定项目的索引路径可能在那段时间内发生变化(例如,如果用户可以插入/删除行),则可能需要更复杂。

您还可以使用像AlamofireImage这样的库来处理这项工作(以不同的方式)。使用AlamofireImage,您的代码将如下所示:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell : ImageCell2 = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ImageCell2            
    cell.titleLabel.text = posts.objectAtIndex(indexPath.row).valueForKey("title") as! NSString as String

    let URL = NSURL(string: self.posts.objectAtIndex(indexPath.row).valueForKey("enclosure") as! String)!
    cell.sideImageView.af_setImageWithURL(URL)

    return cell            
}

答案 1 :(得分:0)

要下载异步图像并设置为UITableViewCell的UIImageView,可以在UIImageView中添加扩展名。

extension UIImageView {
    func downloadImageFrom(link link:String, contentMode: UIViewContentMode) {
        //in my methods, I have a cache to avoid re-downloading my images. Images in cache are identified by its URL
        if let _imageData = ImageCache.shareCache.getImageData(link) {
            self.image = UIImage(data: _imageData)
            return
        }

        //else, download image
        NSURLSession.sharedSession().dataTaskWithURL( NSURL(string:link)!, completionHandler: {
            (data, response, error) -> Void in
            dispatch_async(dispatch_get_main_queue()) {
                self.contentMode =  contentMode
                if let data = data {
                    ImageCache.shareCache.cacheImageData(data, imageId: link)
                    self.image = UIImage(data: data)
                }
            }
        }).resume()
    }
}

然后,从你的回电cellforrow

let cell : ImageCell2 = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! ImageCell2

cell.titleLabel.text = posts.objectAtIndex(indexPath.row).valueForKey("title") as! NSString as String

cell.imageView.downloadImageFrom(yourImageUrl)
return cell