前提・実現したいこと
UICollectionView内のCellに、他関数にて取得したデータを表示させたい
swiftで自作アプリケーションを作成しています。
firebaseに登録したデータを取得して、UICollectionView内のCellにそのデータを反映させたいです。
どうも、「cellForItemAt」が「firebaseからデータ取得する関数」より早く作動してしまい、うまく取得したデータをCellに表示できないようです。
解決方法をご教示願います。
発生している問題・エラーメッセージ
Thread 1: Fatal error: Index out of range
該当のソースコード
import UIKit import Firebase class Home_Home_2_ViewController: UIViewController,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{ @IBOutlet var collectionView: UICollectionView! var dataSet: [[String]] = [] var myindustry: String! = "" override func viewDidLoad() { super.viewDidLoad() getrecommend() collectionView.delegate = self collectionView.dataSource = self let layout = UICollectionViewFlowLayout() layout.scrollDirection = .horizontal collectionView.collectionViewLayout = layout } func getrecommend() { let userID = Auth.auth().currentUser!.uid let docRef = Firestore.firestore().collection("users").document(userID).addSnapshotListener { (snapShot, error) in self.dataSet = [] if error != nil { return } self.myindustry = (snapShot?.get("industry") as! String) print(self.myindustry!) let query = Firestore.firestore().collection("talkerPost").whereField("industry1", isEqualTo: self.myindustry!).getDocuments() { (querySnapshot, err) in if let err = err { print("Error getting documents: (err)") } else { for document in querySnapshot!.documents { print("(document.documentID) => (document.data())") //ここにtableViewにどんどん値入れていく処理入れる let data = document.data() let title:String = data["talkTitle"] as! String //let name = data[""] let price:String = data["price"] as! String + "円" self.dataSet.append([title,price]) //print(name!) print(self.dataSet) print(self.dataSet[0][0]) self.collectionView.reloadData() } } } } } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 3 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "recommendationCell", for: indexPath) let reccomendtitleLabel = cell.viewWithTag(2) as! UITextView reccomendtitleLabel.text = dataSet[indexPath.row][0] let recommendpriceLabel = cell.viewWithTag(3) as! UILabel recommendpriceLabel.text = dataSet[indexPath.row][1] return cell } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let width: CGFloat = UIScreen.main.bounds.width/3 let height = width return CGSize(width: width, height: height) } }
https://qiita.com/hiro0203/questions/fae69be528253436871f
以下ご対応ください。
https://teratail.com/help#posted-otherservice
あなたの回答
tips
プレビュー