2016-03-29 11 views
0

私はカスタムUIViewControllerを作成し、それを実装するように拡張しました:UICollectionViewDataSource、UICollectionViewDelegate。ストーリーボードでは、UICollectionViewを追加し、コントローラからこのUICollectionViewへの参照を作成しました(データソースとコレクションビューのデリゲートの代理人をセットアップします)。UICollectionViewはカスタムUIViewControllerで更新されません

私は明らかにこれらの2人の代表者のための最低限の要件を実装しました。今、私は時々非同期に画像を読み込むので、画像のダウンロードが完了した後にcell.setNeedsLayout()、cell.layoutIfNeeded()、cell.setNeedsDisplay()メソッドを呼び出す(cell.imageView.image = UIImage(...))。私はこれらのメソッドがすべて呼ばれていることを知っていますただし、画面上の画像は更新されませんでした。

私は何かを見逃しましたか?ありがとうございました!

編集:サンプルコードを追加します - 更新が呼び出されたか - それはすぐにスクロールすることができるように

func collectionView(collectionView: UICollectionView, 
    cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
{ 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell 
    .... 

    let cellImage = ServiceFacade.sharedInstance.getImageFromCaching(image!.url) 
    if cellImage == nil { 
     // set image to default image. 
     cell.cellImage.image = UIImage(named: "dummy") 

     ServiceFacade.sharedInstance.getImage(image!.url, completion: { (dImage, dError) in 
      if dError != nil { 
       ... 
      } 
      else if dImage != nil { 
       dispatch_async(dispatch_get_main_queue(),{ 


        let thisCell = self.collectionView.dequeueReusableCellWithReuseIdentifier(self.reuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell 
        thisCell.cellImage.image = dImage 
        thisCell.setNeedsLayout() 
        thisCell.setNeedsDisplay() 
        thisCell.layoutIfNeeded() 
       }) 

      } 
      else{ 
       // do nothing 
      } 
     }) 
    } 
    else { 
     cell.cellImage.image = cellImage! 
     cell.setNeedsDisplay() 
    } 

    // Configure the cell 
    return cell 

} 
+0

メインスレッドでダウンロードした後でイメージを設定していますか?ダウンロードが完了すると、セルはゼロになることがあります。 – Yan

+0

ヤンさん、イメージをダウンロードして設定するときにコードの一部を投稿すれば、それを調べてくれてありがとう。ここでは、私がセルの更新を呼び出すために使用したコードです。しかし、それは動作しませんでした。 –

答えて

0

チャンスはUICollectionViewはあなたのセルの中間表現をキャッシュしているされています。

セルの更新、サイズ変更、および視覚的な表示の再実行が必要であることを示すルーチンは、セルを表す単一のインデックスパスを持つreloadItemsAtIndexPathsです。

+0

ありがとうございます。はい。あなたが正しいです。それは問題を解決した。 –

関連する問題