gpt4 book ai didi

image - 在 UITableView 中加载图像 url swift 2 的最佳方式

转载 作者:行者123 更新时间:2023-12-02 17:27:49 26 4
gpt4 key购买 nike

我想用 swift 2 创建一个带有图像链接列表的 Ui TableView:

例如:var images = ["link1","link2",...,linkN"]

我创建了一个自定义单元格来显示图像:

   let cell = tableView.dequeueReusableCellWithIdentifier(CurrentFormTableView.CellIdentifiers.ImageCell, forIndexPath: indexPath) as! ImageCell
cell.urlImageView.tag = indexPath.row
cell.displayImage(images[index.row])
cell.selectionStyle = UITableViewCellSelectionStyle.None

return cell

这里我有我的自定义单元格来加载我的图像:

import UIKit

class ImageCell: UITableViewCell {

@IBOutlet weak var urlImageView: UIImageView!
@IBOutlet weak var loadingStatus: UIActivityIndicatorView!

override func awakeFromNib() {
super.awakeFromNib()
}

override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}

func loadImageFromUrl(url: String, view: UIImageView){
if view.image == nil {

self.startLoading()
// Create Url from string
let url = NSURL(string: url)!


// Download task:
// - sharedSession = global NSURLCache, NSHTTPCookieStorage and NSURLCredentialStorage objects.
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (responseData, responseUrl, error) -> Void in
// if responseData is not null...
if let data = responseData{

// execute in UI thread
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.stopLoading()
view.image = UIImage(data: data)
})
}
}

// Run task
task.resume()
}
}

func displayImage(imageUrl: String){

imageView?.image = nil
if imageUrl != nil && imageUrl != "" {
print(imageUrl)

loadImageFromUrl(imageUrl,view: urlImageView)

} else {
loadingStatus.hidden = true
}
}

func startLoading(){
loadingStatus.hidden = false
loadingStatus.startAnimating()
}

func stopLoading(){
loadingStatus.hidden = true
loadingStatus.stopAnimating()
}
}

问题是,她有时会正确加载图像,有时,一张或多张图像会“覆盖另一张”,所以我有多个相同的图像,而不是看到所有不同的图像。怎么可能?我的错误在哪里?

最佳答案

您没有实现单元格的重用,这意味着一个单元格的 imageView 图像将与另一个单元格的图像相同,直到加载新图像为止。

要防止这种情况,请实现 -prepareForReuse: 方法:

override func prepareForReuse() {
super.prepareForReuse()
urlImageView.image = nil
// cancel loading
}

此外,您不应该在 View 层中执行任何与网络相关的代码,而应该在 View Controller 中完成。如果已经为特定单元格下载图像,这将允许您实现缓存机制,以及更改其他 View 的状态。

即在你的 View Controller 中:

var cachedImages = [String: UIImage]()    

func cellForRow...() {
let imageURL = imageURLs[indexPath.row]
if let image = cachedImages[imageURL] {
cell.urlImageView.image = cachedImages[imageURL]
}
else {
downloadImage(indexPath, { image in
if let image = image {
cachedImages[imageURL] = image
cell.urlImageView.image = image
}
})
}
}

func downloadImage(indexPath: NSIndexPath, callback: () -> (UIImage?)) {
let task = NSURLSession.sharedSession().dataTaskWithURL(url) { (responseData, responseUrl, error) -> Void in
// if responseData is not null...
if let data = responseData {
// execute in UI thread
dispatch_async(dispatch_get_main_queue(), {
callback(UIImage(data: data))
})
}
else {
dispatch_async(dispatch_get_main_queue(), {
callback(nil)
})
}
}

// Run task
task.resume()
}

关于image - 在 UITableView 中加载图像 url swift 2 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37188358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com