2017-03-21 5 views
3

非常に基本的なことをやろうとしていますが、他の同様の質問で提案されている修正は機能していません。私は画像キャッシュとtableViewを持っています。私はそれが存在する場合は、キャッシュから画像を表示したい、そうでなければ何もないはずです。何らかの理由で、たとえ画像ビューをnilに設定したとしても、tableViewは、間違った画像で再利用されたセルを表示しています。以下は私のコードです:tableView.dequeueReusableCellの最初のステップとしてイメージをnilに設定していても、UITableViewセルに間違ったイメージが表示されています

let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell", for: indexPath) as! SearchResultsTableViewCell 

    cell.profilePhoto?.image = nil 
    cell.profilePhoto?.backgroundColor = UIColor.gray 
    if let userID = myObject.posterId, let profileImage = self.imageCache.object(forKey: userID as AnyObject) { 
     cell.profilePhoto?.image = profileImage 
    } else { 
     if let userId = myObject.posterId { 
      downloadImage.beginImageDownload() { 
       (imageOptional) in 
       if let image = imageOptional { 
        cell.profilePhoto?.image = image 
        self.imageCache.setObject(image, forKey: userId as AnyObject) 
       } 
      } 
     } 
    } 

私は間違っていますか?私が最初の一歩としてそれをしているにもかかわらず、私の人生のためにイメージがなぜゼロに設定されていないのか理解できません!

+0

イメージをnilに設定するだけでは不十分です。また、セルを再利用する前にイメージの読み込みをキャンセルする必要があります。 – HMHero

+0

Kingfisherを使って画像をダウンロードすることをお勧めします。 –

答えて

0

画像をnilに設定しているように見えますが、そのセルを再利用したときに飛んでいる可能性のあるダウンロードを考えましたか?以前のインデックスパスのダウンロードが終了したら、セルのイメージを更新できるようです。

3

問題はdownloadImage.beginImageDownloadで、クロージャーはuitableviewセルへの参照を保持しています。

イメージのダウンロードを完了すると、tableViewが再利用可能なセルを再利用して別の行を表示する場合でも、cell.profilePhoto?.imageプロパティを設定します。

セルがダウンロードされた画像割り当てるため、まだ関連性がある場合は、あなたのセルのtagindexPath.rowとテストに割り当てます。その後、

/* right after cell dequeue */ 
cell.tag = indexPath.row 

/* download finished here */ 
if cell.tag == indexPath.row { 
    /* yeah, I want to rock this cell with my downloaded image! */ 
    cell.profilePhoto?.image = downloadedImage 
} 

注意してください:これは一つだけでテーブルビューで動作しますがセクション。

P.あなたの細胞のclean upをSearchResultsTableViewCell内のprepareForReuseメソッドに配置すると、少しだけ整理することができます。

関連する問題