2015-05-11 2 views
3

Я пытаюсь загрузить набор изображений с Parse.com в UICollectionView. Все работает, кроме функции reloadData(). В приложении я могу нажать кнопку «Назад» и снова ввести UICollectionView, и все изображения есть. Я просто не знаю, что я делаю неправильно с функцией reloadData().Почему 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

Где вы определяете 'self.collectionView'? – idmean

+0

Запустите его в main_queue, как говорит сахара. Это не всегда очень интуитивно, но обычно, когда изменения пользовательского интерфейса не обновляются или не требуют много времени для обновления, попробуйте запустить код в главной очереди. – boidkan

+0

. Кажется, имеют выход к 'collectionView', и поэтому такого свойства' self.collectionView' не существует. Вам не нужен один из функций делегата, которые вы определили, поскольку он передается как параметр, но вы вызываете reloadData(). – Grimxn

ответ

8

reloadData Необходимо выполнить в главной теме, чтобы обновить интерфейс. Вы можете попробовать это

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

И как это было предложено @Grimxn, вы должны проверить, если ваш collectionView IBOutlet подключен в раскадровке или файле XIb.

+0

По-прежнему не работает, если у него нет выхода к коллекцииView ... – Grimxn

+0

Он сказал, что если он вернется и снова войдет на экран, просмотр коллекции будет обновлен. Поэтому я думаю, что он уже установил выход. В любом случае, спасибо за комментарий. Я обновлю ответ. – sahara108

+0

... вот что произойдет, если у него не будет выхода. Делегат по-прежнему будет предоставлять данные, даже если у него нет выхода, он просто не может вызвать reloadData() сам, он должен полагаться на перезагрузку системы для него ... – Grimxn

Смежные вопросы