ios - 来自 for in 数组的变量不会快速显示在我的 Collection View 中

标签 ios image swift uiimage uicollectionview

        //
    //  ViewController.swift
    //  Fashun
    //
    //  Created by Alex Macleod on 20/10/14.
    //  Copyright (c) 2014 Alex Macleod. All rights reserved.
    //

    import UIKit

    class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

        var collectionView: UICollectionView?

        var instanceOfCustomObject: CustomObject = CustomObject()
        var accessToken: NSString!
        var userDefaults: NSUserDefaults!

        // the range represents integer values 0, 1, and 2
        // the range now represents integer values 6, 7, and 8

        let colorWheel = ColorWheel()
        var photoCount: Int! = 0
        var photos: UIImage! = UIImage()

    //    private let api = "d4984c8cfa78689bd066d82bec820fd5"



        override func viewDidLoad() {
            super.viewDidLoad()

            userDefaults = NSUserDefaults.standardUserDefaults()
            self.accessToken = userDefaults!.objectForKey("accessToken") as NSString
            println(self.accessToken)

            //        instanceOfCustomObject.someProperty = "Hello World"
    //        var accessToken : NSString? = NSString(instanceOfCustomObject.accessToken)
    //        println(accessToken)
    //        instanceOfCustomObject.authorize()
    //        instanceOfCustomObject.simpleAuth()


            // Do any additional setup after loading the view, typically from a nib.
            let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    //        layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)
            layout.itemSize = CGSize(width: 124, height: 124)
            layout.minimumInteritemSpacing = 1.0
            layout.minimumLineSpacing = 1.0
            collectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
            collectionView!.dataSource = self
            collectionView!.delegate = self
            collectionView!.registerClass(Cell.self, forCellWithReuseIdentifier: "Cell")
            collectionView!.backgroundColor = UIColor.whiteColor()
            self.view.addSubview(collectionView!)

            getData()

        }

        func getData() -> Void {
            let baseUrl = NSURL(string:"https://api.instagram.com/v1/users/3/media/recent/?access_token=\(self.accessToken)")

            let forcastUrl = NSURL(string: "", relativeToURL: baseUrl)

            //        let data = NSData(contentsOfURL: forcastUrl)
            //        println(data)
            let sharedSession = NSURLSession.sharedSession()
            let downloadTask: NSURLSessionDownloadTask = sharedSession.downloadTaskWithURL(baseUrl, completionHandler: { (location: NSURL!, response: NSURLResponse!, error: NSError!) -> Void in


                //            var urlContents = NSString.stringWithContentsOfURL(location, encoding: NSUTF8StringEncoding, error: nil)
                //            println(urlContents)

                let dataObject = NSData(contentsOfURL: baseUrl)
                //            println(dataObject)
                if (error == nil) {
                    let responseDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(dataObject, options: nil, error: nil) as NSDictionary

                    var currentResponse = responseDictionary.valueForKeyPath("data.images.standard_resolution.url") as NSArray
//                    println(currentResponse)

                    for url in currentResponse {
                        var urls: NSString = url as NSString
//                        println(images)
                        var photoUrls = NSURL.URLWithString(urls)

                        var err: NSError?
                        var imageData :NSData = NSData.dataWithContentsOfURL(photoUrls,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
                        var photos = UIImage(data:imageData)
                    }


                    //                println(currentResponse)
                    //                self.currentResponse = currentResponse as NSArray
//                    self.photoCount = currentResponse.count as Int
//                    println(self.photoCount)

                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        self.photoCount = currentResponse.count as Int!
                        self.collectionView!.reloadData()
                        //                    self.temperatureLabel.text = "\(currentWeather.temperature)"
                        //                    self.iconView.image = currentWeather.icon!
                        //                    self.currentTimeLabel.text = "At \(currentWeather.currentTime!) it is"
                        //                    self.humidityLabel.text = "\(currentWeather.humidity)"
                        //                    self.percipitationLabel.text = "\(currentWeather.precipProbability)"
                        //                    self.summeryLabel.text = "\(currentWeather.summary)"
                        //
                        //                    self.refreshActivityIndicator.stopAnimating()
                        //                    self.refreshActivityIndicator.hidden = true
                        //
                        //                    self.refreshButton.hidden = false
                    })

                } else {

                    let networkIssueController = UIAlertController(title: "Error", message: "I got 99 problems but a bitch ain't one", preferredStyle: .ActionSheet)
                    let okButton = UIAlertAction(title: "OK", style: .Default, handler: nil)
                    networkIssueController.addAction(okButton)
                    let cancelButton = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)
                    networkIssueController.addAction(cancelButton)

                    self.presentViewController(networkIssueController, animated: true, completion: nil)

                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        //Stop refresh animation
                        //                    self.refreshActivityIndicator.stopAnimating()
                        //                    self.refreshActivityIndicator.hidden = true
                        //                    self.refreshButton.hidden = false

                    })

                }

            })

            downloadTask.resume()

        }

您可以在 getData() 函数中看到我有一个 for in 循环,循环遍历 url 数组,将这些 url 更改为 UIImages 并将其分配给名为 photos 的全局变量。

        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as Cell
            println(photos)
//            cell.textLabel.text = "Text"
            cell.imageView.image = photos
//            cell.imageView.backgroundColor = colorWheel.randomColor()

            return cell
        }
    }

您可以在这个 collectionview 函数中看到我试图通过将我的照片变量(我的 url 循环现在是 UIImages)分配给 imageView 单元格来显示图像。没有任何反应 我只是在我的 IOS 模拟器上看到一个白屏,但我的打印语句打印出了我试图显示的所有图像!

提前致谢。

最佳答案

当您解析来自 API 的响应时,您需要将图像存储到 NSMutableArray 中。修改后的代码将类似于以下内容:

var photos = NSMutableArray()

在分配接收到的图像数据的 for 循环中,您将拥有...

photos.addObject(UIImage(data:imageData))

collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 函数中,您将像这样加载图像:

cell.imageView.image = photos.objectAtIndex(indexPath.row)

您的 Collection View 现在应该开始显示图像,但是,您还应该考虑加载每个图像所产生的延迟以及重新加载它们所需的时间。您应该考虑使用缓存类来缓存已下载的图像,以便用户在刷新或重新加载应用程序时不必重新加载它们。

SAMCache 是一个很好的缓存库,可以按预期工作,您可以在这里找到它:https://github.com/soffes/SAMCache 。实现相当简单并且切题。

关于ios - 来自 for in 数组的变量不会快速显示在我的 Collection View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26673189/

相关文章:

android - 具有相同名称的不同应用程序?

html - 我试图从左到右浮动 5 个按钮

iPhone/Android - 保护应用程序下载的图像

ios - 为什么 UICollectionViewCell 的导出为零?

ios - WKWebView 操作表在被解散后解散呈现 View Controller

ios - 如何使用 pushWoosh 更新 iOS 角标(Badge)?

ios - uiscrollview 滞后于渐变单元格背景

php - 将具有图像尺寸的记录更新到数据库。我想等不到10小时

ios - DateFormatter 不返回 "HH:mm:ss"的日期

arrays - ContigiousArray的内部结构