尝试将firebase字符串值附加到集合视图

时间:2017-10-01 17:42:09

标签: arrays swift firebase append

我正在尝试将Firebase字符串值添加到集合视图中,但它在cell.statsLabel.text = statData[indexPath.row] - >上给出了错误。线程1:EXC_BREAKPOINT(代码= 1,子代码= 0x101ed3b50)。我的Firebase是正确的(我已经为标签添加了值)问题正在追加。它甚至不通过retrieveUserData函数!下面的图像链接是我的集合视图应该是什么样的,左边的标签是statHeader数组,右边的标签是statData数组 - > The collectionview image。任何想法?

class SceneTwoViewController: UIViewController, GADRewardBasedVideoAdDelegate, UIAlertViewDelegate, UICollectionViewDelegate, UICollectionViewDataSource {

    var statHeaders:[String] = []
    var statData:[String] = []

    var ref: FIRDatabaseReference?
    var databaseHandle: FIRDatabaseHandle?
    var streakCheck = ""

    @IBOutlet var statsCollectionView: UICollectionView!
    @IBOutlet var entireView: UIView!
    @IBOutlet var activityIndicator: UIActivityIndicatorView!
    @IBOutlet var ovImage: UIImageView!
    @IBOutlet var Watchbtn: UIButton!
    @IBOutlet var StreakImage: UIImageView!
    @IBOutlet var StatusLabel: UILabel!
    @IBOutlet var TimeDisplay: UIImageView!
    @IBOutlet var statusCheck: UILabel!
    @IBOutlet var nameLabel: UILabel!


    func retrieveUserData() {

        let user = FIRAuth.auth()?.currentUser?.uid

        ref?.child("users").child(user!).observeSingleEvent(of: .value, with: { snapshot in

            print("Dan2")
            let value = snapshot.value as? NSDictionary
            let statret = value?["status"] as? String ?? ""
            let streakret = value?["streakNumber"] as? String ?? ""
            let placesret = value?["placesHelped"] as? String ?? ""

            self.statData.append(statret)

            self.statData.append(streakret)

            self.statData.append(placesret)


        })

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        self.ref = FIRDatabase.database().reference()
        let user = FIRAuth.auth()?.currentUser?.uid

        print("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW")

        retrieveUserData()
        statHeaders.append("Status: ")
        statHeaders.append("Streak: ")
        statHeaders.append("Places Helped: ")

    }


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        return statHeaders.count

    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "statsCell", for: indexPath) as! statsCollectionViewCell //statsCollectionViewCell is name of external file with labels
        print(statData.count) // prints 0
        print(statHeaders.count) // prints 3
        cell.headerLabel.text = statHeaders[indexPath.row]
        cell.statsLabel.text = statData[indexPath.row]
        return cell

    }


}

1 个答案:

答案 0 :(得分:0)

您正在使用statHeaders数组作为集合的数据源,并且在方法cellForItemAt中,当您的statData为空时,您尝试从该数组和同一indexPath的statData中检索对象。这就是它导致错误的原因。

如果您的集合主要依赖于statData而不是statHeaders,那么您应该使用statData作为数据源。

另外,在你的情况下,检查两个数组是否具有相同的对象数是非常重要的,或者使用选项,如果statHeaders是主数组并且集合应该依赖于它的值,但是statDate并不重要,那么don& #39;如果在当前indexPath上没有对象,则使用statData:

if statData.count > indexPath.row {
    //use statData array only in this case
}

此外,我还没有看到您在检索数据后尝试重新加载您的收藏。

如果您的数据检索异步工作,我认为您应该添加重新加载:

ref?.child("users").child(user!).observeSingleEvent(of: .value, with: { snapshot in

            print("Dan2")
            let value = snapshot.value as? NSDictionary
            let statret = value?["status"] as? String ?? ""
            let streakret = value?["streakNumber"] as? String ?? ""
            let placesret = value?["placesHelped"] as? String ?? ""

            self.statData.append(statret)

            self.statData.append(streakret)

            self.statData.append(placesret)

    self.statsCollectionView.reloadData()

        })