我正在尝试将图像从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
}
此方法仅下载图像一次。下载图像后,它会附加到数组中,下次它会显示数组中的图像而无需再次下载。但这种方法对于滚动来说有点困难。任何人都知道为什么?
答案 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