我正在尝试将一组图像从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
}
}
答案 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 */
}