質問編集履歴

1 色々

nekokichi

nekokichi score 38

2019/02/04 20:18  投稿

【Swift】スクロールするたびにCollectionViewのセルの順序が変わる
メルカリのような通販アプリを作っていて、出品した商品を画像付きでタイムライン形式で表示する画面を作っています。
![イメージ説明](56e9f4415d142d87ab27d941935220e8.png)
別画面でFirebaseにデータを保存して、ホーム画面でデータを取得し、取得した順に表示したいのですが..。
今直面している問題は、スクロールして隠れたセルの画像(配置?)がなぜか入れ替わっていることです。
![イメージ説明](be96d502b440a0bdd7a385b14896e305.png)
データを格納する配列を出力しましたが、
- スクロール中に同じデータを新たに取得してはいない
- 配列内の順序が変わってはもいない
という結果で原因がわかりません。
UICollectionViewの元々の仕様なのか、それとも単に隠れたセルは読み込む前の状態に戻ってしまうからなのか、何が問題なのでしょうか?
どうか、ご回答よろしくお願いします。
```Swift  
import UIKit
import Firebase
import FirebaseUI
import SDWebImage
class Home: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource {
   
   @IBOutlet weak var collectionView: UICollectionView!
   
   //Firebaseから取得したItemIDを格納する
   var photos = [String]()
   //cellForItemAtが実行されたカウント
   var count_cellfunc = 0
   
   override func viewDidLoad() {
       super.viewDidLoad()
       collectionView.delegate = self
       collectionView.dataSource = self
       downloadImageData()
   }
   
   func numberOfSections(in collectionView: UICollectionView) -> Int {
       return 1
   }
   
   func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       return photos.count
   }
   
   func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
       count_cellfunc += 1
       let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
       if count_cellfunc >= photos.count {
           return cell
       }
       //imageViewを宣言
       let imageView = cell.contentView.viewWithTag(1) as! UIImageView
//       print("indexPath.row = ", indexPath.row)  
       let storageref = Storage.storage().reference(forURL: "gs://bookshare-b78b4.appspot.com").child("userID").child("Item").child(photos[indexPath.row])
       imageView.sd_setImage(with: storageref)
//       imageView.setImage(with: storageref as? Resource, placeholder: nil, options: nil, progressBlock: nil, completionHandler: nil)  
       //画像をセット  
//       imageView.kf.setImage(with: storageref as? Resource)  
//       if self.photosCount - 1 == indexPath.row {  
//           self.photos = [String]()  
//           self.photosCount = Int()  
//       }  
       return cell
   }
   
   //FirebaseからItemのURLを取得する
   func downloadImageData() {
       let ref = Database.database().reference(fromURL: "https://bookshare-b78b4.firebaseio.com/")
       self.photos = [String]()
       ref.child("Item").observe(.value) { (snap) in
           print("---")  
           print("-------")  
           for item in snap.children {
               let snapdata = item as! DataSnapshot
               //1つのデータ
               print(snapdata)
               let item = snapdata.value as! [[String:String]]
               self.photos.append(item[0]["ItemID"]!)
               print(self.photos)
//               print(1111)  
//               print(self.photos)  
           }
//           self.photosCount = self.photos.count  
           self.collectionView.reloadData()
       }
//       ref.child("Item").observeSingleEvent(of: .value) { (snap, error) in  
//  
//  
//       }  
   }
}
}
```
  • iOS

    7288 questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • Swift

    14420 questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る