在UITableView中加载图像URL Swift 2的最佳方法

范德罗

我想用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: method

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

此外,您不应在视图层中进行任何与网络相关的代码,而应在视图控制器中进行。如果已经为特定单元格下载了图像,这将允许您实施缓存机制,并更改其他视图的状态。

即在您的视图控制器中:

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()
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Swift 2从URL变量加载图像错误

如何在Swift中加载GIF图像?

Swift:在UITableViewCell中加载图像异步

在Swift 2(Metal)中加载STL对象

在Swift中加密密码的最佳方法是什么?

UITableView分页-底部刷新以在Swift中加载新数据

Swift 3:URL图像使UITableView滚动缓慢

如何使用 Swift 从 iOS 中的包中加载图像

在Swift中加载图像时应用程序冻结

Swift:无法在WKWebView中加载本地图像

使用 Kingfisher 在 Swift 中加载图像有困难

从网络抖动中加载图像的更好方法

使用onLoad方法在React中加载图像?

处理Swift 2中异步关闭错误的最佳方法?

图像未在Angular 2中加载

Angular 2 - 加载/繁忙模式的最佳方法

如何在Swift中的UIWebView中加载URL?

SWIFT:为什么无法在UIWebView中加载当前URL?

iOS Swift:无法检索UIwebView中加载的当前URL

在Android Java中加载资产的最佳方法

在Symfony 2中验证URL的最佳方法

在Swift上从URL加载/下载图像

Swift-管理静态字符串和常量(如URL,ID,图像名称等)的最佳方法是什么

Swift 4 在 UITableView 中显示来自 api 的图像的正确方法

在Swift中存储和刷新批量数据以在UITableView中使用的最佳方法

如何使用Swift在UITableview中加载自定义单元格(Xib)

从Swift包中加载字体

使用swift保存和加载自定义对象数组的最佳方法是什么?

从SWIFT的Web视图显示应用程序中存储的图像的最佳方法