William Woo
William Woo

Reputation: 3

Fatal error: Array index out of range. About a collectionView

The controller has a collectionView, including 1 cell, 5 section and some row, downloading data from LeanCloud just like Parse. Code always fails with fatal error: Array index out of range. In my opinion, I may have some problem in dealing with array of array, about how to access and how to add element. Any one can help me solve this bug? The bug line is listed below:
var temp = self.restaurantLean[number].

import UIKit
import AVOSCloud

class DiscoverViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, RestaurantLeanCollectionCellDelegate, UIGestureRecognizerDelegate {


@IBOutlet var imageView: UIImageView!

@IBOutlet var collectionView: UICollectionView!

private var restaurantLean = [[RestaurantLean]]()

override func viewDidLoad() {

    super.viewDidLoad()

    collectionView.backgroundColor = UIColor.clearColor()

    loadTripsFromLeanCloud()    

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

//MARK: Data Source
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return restaurantLean.count
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return restaurantLean[section].count
}


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! RestaurantLeanCollectionCell
    cell.delegate = self
    cell.nameLabel.text = restaurantLean[indexPath.section][indexPath.row].name
    cell.typeLabel.text = restaurantLean[indexPath.section][indexPath.row].type
    cell.locationLabel.text = restaurantLean[indexPath.section][indexPath.row].location
    cell.isLike = restaurantLean[indexPath.section][indexPath.row].isLike
    cell.imageView.image = UIImage()
    cell.layer.cornerRadius = 4.0
    if let image = restaurantLean[indexPath.section][indexPath.row].image {
            image.getDataInBackgroundWithBlock({ (imageData, error) -> Void in
                print(image)
                if let data = imageData {
                    print("loading")
                    cell.imageView.image = UIImage(data: data)
                    print("success")
                }
            })
        }
    return cell
}

//Download the data from Baas LeanCloud

func loadTripsFromLeanCloud() {

    restaurantLean.removeAll(keepCapacity: true)

    for number in 0...4 {
        let name = "Restaurant_" + String(number)
        print(name)
        print(number)
        let query = AVQuery(className: name)
        query.cachePolicy = AVCachePolicy.NetworkElseCache
        print("1")
        query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
            print("2")
            if let error = error {
                print("3")
                print("Error: \(error) \(error.userInfo)")
            }
            print("4")
            if let objects = objects {
                print("5")
                for (index, object) in objects.enumerate() {
                    let restaurant = RestaurantLean(avObject: object as! AVObject)
                    self.restaurantLean[number].append(restaurant)
                    let indexPath = NSIndexPath(forRow: index, inSection: number)
                    self.collectionView.insertItemsAtIndexPaths([indexPath])

                }
            }
        })
        print("6")
    }
}

Upvotes: 0

Views: 722

Answers (1)

glyuck
glyuck

Reputation: 3397

You are not adding elements to restaurantLean array itself (you only add objects to nested arrays). Here is possible solution.

func loadTripsFromLeanCloud() {
    restaurantLean.removeAll(keepCapacity: true)
    for number in 0...4 {
        restaurantLean.append([])  // This line
        // ...
    }
}

Upvotes: 0

Related Questions