0

私はここで本当に奇妙な問題を抱えていると思います。一部の TableView では、Parse から画像を読み込むと、データのないセルに別の画像が表示されることがあります。

コードを作成する方法は、Parse でファイルの存在を確認することです。画像がある場合は、PFImageView各セルの背景に画像を読み込みます。

ただし、データベースに画像が保存されていない場合はPFImageView、プレースホルダーであるローカル画像を使用することになっています。ただし、多くの場合、私のPFTableViewでは、画像データのないセルが他のセルから画像を取得します。誰かが理由を知っていますか?または修正を知っていますか?

コードは次のとおりです。

if business["businessImage"] as? PFFile != nil {
    var file: PFFile = business["businessImage"] as PFFile
    cell.businessPhoto.file = file
    cell.businessPhoto.loadInBackground()
}                        
else {
    cell.businessPhoto.image = UIImage(named: "placeholder user photo")
}

loadInBackground()の代わりに使用しているからloadInBackgroundWithBlock()ですか?

4

3 に答える 3

2

キャッシュを使用しない場合、私が見つけた回避策は、最初に画像ファイルをcellForRowAtIndexPathプレースホルダー画像に設定し、サーバー上で画像オブジェクトが見つかった場合、セル画像を新しいファイルに設定し、バックグラウンドでロードすることです.

コードは次のとおりです。

        myCell.profilePic.image = UIImage(named: "placeholder user image")

        if let file: PFFile = object["profilePicture"] as? PFFile {
            myCell.profilePic.file = file
            myCell.profilePic.loadInBackground()
        }

みんな助けてくれてありがとう!

于 2015-03-07T20:02:57.333 に答える
1

この質問には、indexPath に基づいてビジネスが設定されているコードは示されていません。うまくいけば、行に基づく配列での単純な検索に過ぎません。

投稿されたコードの特定の問題の 1 つcell.businessPhoto.imageは、非同期フェッチを実行した場合にすぐに設定されないことです。

表示される効果は、正しい画像のフェッチが行われている間、(再利用のため) 別の行からの画像がセルに含まれることです。解決策は、無条件にプレースホルダー イメージを設定することです。

2 つ目の問題はオプションですが、ほぼ必須です: イメージのキャッシュです。このようにして、ユーザーがスクロールしても再取得し続けることはありません。これにより、 cellForRowAtIndexPath コードで別の組織が作成されます。

// this outer conditional is your original code
if (this business has a "businessImage" PFFile) {
    // new: check for cached image
    if (the image is cached) {
        set cell image to the cached image
    } else {
       // new: always set a placeholder, maybe a special one for fetching
       set cell image to a placeholder (one that indicates fetching)
       asynch fetch the image, with completion block {
           cache the image
           set cell image to the image
       }
    }
} else {
    set cell image to a placeholder (one that indicates no image)
}

フェッチを開始している場合でも、すべての場合にすぐにセル イメージを設定することに注意してください。このようにすれば、prepareForReuse または didEndDisplay フックを実装する必要はありません。

于 2015-03-07T17:19:06.710 に答える