メルカリのような通販アプリを作っていて、出品した商品を画像付きでタイムライン形式で表示する画面を作っています。
↓
別画面でFirebaseにデータを保存して、ホーム画面でデータを取得し、取得した順に表示したいのですが..。
今直面している問題は、スクロールして隠れたセルの画像(配置?)がなぜか入れ替わっていることです。
↓
データを格納する配列を出力しましたが、
- スクロール中に同じデータを新たに取得してはいない
- 配列内の順序が変わってはもいない
という結果で原因がわかりません。
UICollectionViewの元々の仕様なのか、それとも単に隠れたセルは読み込む前の状態に戻ってしまうからなのか、何が問題なのでしょうか?
どうか、ご回答よろしくお願いします。
Swift
1import UIKit 2import Firebase 3import FirebaseUI 4import SDWebImage 5 6class Home: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource { 7 8 @IBOutlet weak var collectionView: UICollectionView! 9 10 //Firebaseから取得したItemIDを格納する 11 var photos = [String]() 12 //cellForItemAtが実行されたカウント 13 var count_cellfunc = 0 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 collectionView.delegate = self 19 collectionView.dataSource = self 20 downloadImageData() 21 } 22 23 func numberOfSections(in collectionView: UICollectionView) -> Int { 24 return 1 25 } 26 27 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 28 return photos.count 29 } 30 31 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 32 count_cellfunc += 1 33 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 34 if count_cellfunc >= photos.count { 35 return cell 36 } 37 //imageViewを宣言 38 let imageView = cell.contentView.viewWithTag(1) as! UIImageView 39 let storageref = Storage.storage().reference(forURL: "gs://bookshare-b78b4.appspot.com").child("userID").child("Item").child(photos[indexPath.row]) 40 imageView.sd_setImage(with: storageref) 41 return cell 42 } 43 44 //FirebaseからItemのURLを取得する 45 func downloadImageData() { 46 let ref = Database.database().reference(fromURL: "https://bookshare-b78b4.firebaseio.com/") 47 self.photos = [String]() 48 ref.child("Item").observe(.value) { (snap) in 49 for item in snap.children { 50 let snapdata = item as! DataSnapshot 51 //1つのデータ 52 print(snapdata) 53 let item = snapdata.value as! [[String:String]] 54 self.photos.append(item[0]["ItemID"]!) 55 print(self.photos) 56 } 57 self.collectionView.reloadData() 58 } 59 } 60 61}
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/02/05 08:00
2019/02/05 08:58
2019/02/06 03:32