【问题标题】:Trying to append firebase string values to collection view尝试将 firebase 字符串值附加到集合视图
【发布时间】:2018-03-12 21:51:24
【问题描述】:

我正在尝试将 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

    }


}

【问题讨论】:

    标签: arrays swift firebase append


    【解决方案1】:

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

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

    另外,在您的情况下,检查两个数组是否具有相同的对象计数非常重要,或者使用可选选项,例如 statHeaders 是主数组并且集合应该依赖于它的值,但 statDate 并不重要,那么不要'如果当前 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()
    
            })
    

    【讨论】:

    • 这是完美的答案,非常感谢,我已经找了好几个星期了!我将重新加载添加到最后并添加 if statData.count > indexPath.row { cell.statsLabel.text = statData[indexPath.row] }
    猜你喜欢
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2015-10-13
    相关资源
    最近更新 更多