Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

iOS

access variable within a function and put it as the return for another function swift

` // // 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!

    var responseDictionary: NSDictionary!
//    var currentResponse: NSArray!


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

    let colorWheel = ColorWheel()
//    let parse = Parse()

//    var currentResponse: NSArray?
//    struct photoCount {
//    init(responseDictionary: NSDictionary) {
//
//        //        var currentResponse = responseDictionary["data"] as NSDictionary
//
//        var currentResponse = responseDictionary.valueForKeyPath("data") as NSArray
//        var photoCount = currentResponse.count as Int
//        println(photoCount)
//    }
//    }
    var photoCount: Int!

//    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") as NSArray

                //                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.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()

    }

In the getData() function a variable nameed "currentResponse" retrieves an array of urls. I then count the array and assign the number to a variable named "photoCount" ` func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

//        var photoCount = parse.photoCount(currentResponse)
        return photoCount
    }

` I want to use the "photoCount" variable to tell my collection view function how many sections it should have! there are 20 urls so it should output 20 squares but currently photoCount is nil! Do I need to make "photoCount" a global variable? Been stuck on this for ages please help!

1 Answer

Hi Alex,

Making the photoCount global will help, and as far as I've seen in your code, it is global since it is declared in the class implementation and not inside a function. It will help to also initialise it to 0 from the beginning.

Once you get a value greater than 0, after you count the url in that array, you need to call a .reloadData() on that collection view in order to make it go back and read how many items are in the section.

This is how this loop will work:

  • App loads the screen
  • photoCount is initialised to 0
  • CollectionView calls itemsInSection and returns 0 ( photoCount )
  • Call to getData is made
  • Once the network call responds you get your photoCount's value and assign it.
  • Call to collectionView.reloadData() triggers the collectionView to go back and try displaying its cells again.

When the last step hits, you should already have a greater value than 0 in your photoCount, hence the cells will start displaying.

Hope this helps.

Thanks it works! that helped so much been stuck on this for way too long... so frustrating. I have a new problem please help link

Your answer has been posted on SO. If you find it useful don't forget to up-vote :)