CollectionView cellForItemAtIndexPath数据源方法中的意外非空返回值

时间:2016-08-21 20:13:54

标签: swift parse-platform

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    if let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as? PictureCellForHomeVC {
        picArray[indexPath.row].getDataInBackgroundWithBlock({ (data: NSData?, error: NSError?) in
            if error == nil {
                if let data = data {
                    let image = UIImage(data: data)
                    cell.imageView.image = image
                    return cell
                }
            }
        })
    }else {
        return UICollectionViewCell()
    }
}

在上面的代码中,我收到错误:

Unexpected Non Void return value in void function

上面代码中的picArray是包含PFFile个对象的代码,我可以将其称为getDataInBackgroundWithBlock方法。

我理解错误意味着什么,因为getDataInBackgroundWithBlock的completionHandler返回void所以我无法返回我的单元格,但我仍然坚持如何解决这个问题。< / p>

我甚至无法将单独的闭包传递给方法cellForItemAtIndexPath,因为我没有调用该方法,而且它是一种数据源方法。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你试图返回你认为在你的函数中返回的东西,但实际上是试图从getDataInBackgroundWithBlock返回一些应该返回void的东西(这是不允许的,因此错误)

您可以执行类似这样的操作,在此期间加载图像,同时为其添加占位符图像(以增加效果):

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
if let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as? PictureCellForHomeVC {
        picArray[indexPath.row].getDataInBackgroundWithBlock({ (data: NSData?, error: NSError?) in
            if error == nil {
                self.loadImage(inImageView: cell.imageView, withData: data)
            }
        })
        return cell 
} else {
    return UICollectionViewCell()
}


func loadImage(inImageView imageView: PFImageView, withData imageFile: PFFile?) {
    imageView.image = UIImage(named: "placeholder.png") // Some placeholder while the image loads asyncronously
    if let imageFile = imageFile {
        imageView.file = imageFile
        imageView.loadInBackground(nil)
    }
}