为什么reloadData()在我的应用程序中不起作用?

时间:2015-05-11 16:37:41

标签: ios swift parse-platform uicollectionview

我正在尝试将一组图像从Parse.com下载到UICollectionView中。一切都有效,除了reloadData()函数。在应用程序中,我可以点击后退按钮并重新进入UICollectionView,所有图像都在那里。我只是不知道我在使用reloadData()函数做错了什么。

var images = [UIImage]()
var imageFiles = [PFFile]()

class CollectionCollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

@IBAction func xy1Button(sender: AnyObject) {

}

@IBAction func xy2Button(sender: AnyObject) {

        var downloadImages = PFQuery(className: "XY2")
        downloadImages.whereKey("Expansion", equalTo: "XY2")
        downloadImages.findObjectsInBackgroundWithBlock {
            (objects: [AnyObject]?, error: NSError?) -> Void in
            if error == nil {
                println("Successfully retrieved \(objects!.count) cards.")
                if let objects = objects as? [PFObject] {
                    for object in objects {
                        imageFiles.append(object["Image"] as! PFFile)
                        dispatch_async(dispatch_get_main_queue() ^{
                            self.collectionView.reloadData()
                            });
                        //ERROR BREAKPOINT HERE:'Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)'
                    }
                }
            } else {
                println("Error: \(error!) \(error!.userInfo!)")
            }    
      }
}   
override func viewDidLoad() {
    super.viewDidLoad()
  }

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

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell: CardsCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! CardsCollectionViewCell
    //cell.cardsImg.image = UIImage(named: cards[indexPath.row] as String)
    //return cell
    imageFiles[indexPath.row].getDataInBackgroundWithBlock{
        (imageData: NSData?, error: NSError?) -> Void in

        if error == nil {

            let image = UIImage(data: imageData!)

            cell.cardsImg.image = image
        }


    }
    return cell
}
}

2 个答案:

答案 0 :(得分:8)

需要在主线程中执行reloadData来更新UI。你可以试试这个

dispatch_async(dispatch_get_main_queue(), ^{
            self.collectionView.reloadData()
}); 

正如@Grimxn建议的那样,你应该检查你的collectionView IBOutlet是否在storyboard或xib文件中连接。

答案 1 :(得分:0)

尽管我打算这样做,但我只是忘记了,而且我在您的代码中没有看到它,因此也可能是您的问题。我从来没有将ViewController设置为collectionView.delegate和collectionView.dataSource

我使用了需要委托的图像选取器,TableViews和其他UI组件,但这次却完全忽略了它。

这是我的代码:

class MainViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.delegate = self
        collectionView.dataSource = self
    }

    func setData(data: String) {
        DispatchQueue.main.async {
            collectionView.reloadData()
        }
    }

    /* DELEGATE METHODS
    .........
    END DELEGATE METHODS */
}