2017-02-23 5 views
0

画像とラベルがセル内にあります。ページに収まるものよりも多くのセルがある場合は、スクロールダウンして別のイメージを一時的にロードして元の写真をロードします。私はStackOverflowを読んで何が私のケースではうまくいくかを見てきましたが、私のUITableViewはViewControllerの中にあるので、これまで何も見つかりませんでした。ここでUITableViewCellの画像は、スクロールダウン後に変更されます。

は、私は私の細胞内への私のコンテンツをロードする方法である:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PostTableViewCell 
    // Configure the cell... 
    let post = self.posts[indexPath.row] as! [String: AnyObject] 
    cell.titleLabel.text = post["title"] as? String 
    cell.priceLabel.text = post["price"] as? String 
    if let imageName = post["image"] as? String { 
     let imageRef = FIRStorage.storage().reference().child("images/\(imageName)") 
     imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil { 
      let image = UIImage(data: data!) 
      UIView.animate(withDuration: 0.4, animations: { 
       cell.titleLabel.alpha = 1 
       cell.postImageView.alpha = 1 
       cell.priceLabel.alpha = 1 
      cell.postImageView.image = image 
      }) 
     } else { 
      print("Error occured during image download: \(error?.localizedDescription)") 
      } 
     }) 
    } 
    return cell 
} 

は、私はこれが起こらない別の何かにtableView.dequeueReusableCellを変えることができる方法はありますか?

+0

'willDisplayCell 'メソッドで画像を設定しよう –

+0

なぜあなたは画像をアニメーション化していますか?アニメーションの前に設定するだけです。 –

+0

@AdrianBobrowski willDisplayCellを使うために関数全体を設定すべきですか? – gabe

答えて

3

あなたのテーブルビューセルPostTableViewCellでは、あなたが完了内のセルを更新するので、細胞は、私はあなたが問題に実行考える彼らの古いコンテンツ

+0

これはうまくいきますが、インターネットの速度が遅いスクロールするたびにイメージをロードする必要があります。画像をキャッシュする方法はありますか? – gabe

+0

これを行うには、画像をサーバーコードから画像をロードすることをテーブルのセルコードに分離する必要がありますが、その方法を正確に知るためには、十分に精通していません。彼らは利用できるメモリ内ストアを持っていなければなりません – bolnad

+0

AppleのドキュメントはprepareForReuseについてこう書いています: "パフォーマンス上の理由から、アルファ、編集、選択状態など、コンテンツに関連しないセルの属性のみをリセットしてください。 "しかし、私のUITableViewは、このソリューションは私のために完璧に動作するように多くの細胞にしていない! – abanet

0

に上保持されている方法

override func prepareForReuse() { 
    super.prepareForReuse() 
    self.postImageView.image = nil 
    // Set cell to initial state here, reset or set values 
} 

を実装する必要がありますブロック。完了ブロックを実行する前にセルが表示外にスクロールすると、別の行に再利用されますが、前の行のイメージを設定しています。

はこのお試しください:

imageRef.data(withMaxSize: 25 * 1024 * 1024, completion: { (data, error) -> Void in if error == nil { 
     if let cell = self.tableView.cellForRow(at: indexPath) as? PostTableViewCell { 
      let image = UIImage(data: data!) 
      UIView.animate(withDuration: 0.4, animations: { 
       cell.titleLabel.alpha = 1 
       cell.postImageView.alpha = 1 
       cell.priceLabel.alpha = 1 
       cell.postImageView.image = image 
      } 
     }) 

の代わりに、まだセルに頼って見えているが、これはindexPathに基づいて、テーブルビューからそれを取得しようとします。これ以上表示されない場合、cellForRow(at:)nilを返します。

関連する問題