Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【swift】UICollectionView内のCellにfirebaseから取得したデータを反映させたい

解決したいこと

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)
    }
}

問題箇所

reccomendtitleLabel.text = dataSet[indexPath.row][0]
0

1Answer

表示するデータが常に3件であるとは限らないのではないでしょうか。

0Like

Your answer might help someone💌