2017-10-01 3 views
0

Firebaseの文字列値をコレクションビューに追加しようとしましたが、cell.statsLabel.text = statData[indexPath.row] - >スレッド1:EXC_BREAKPOINT(コード= 1、サブコード= 0x101ed3b50)でエラーが発生しています。問題が追加されている私のFirebaseが正しい(私はラベルに値を加えた)。それはretrieveUserData関数を経由しません!以下の画像リンクは、左のラベルがstatHeader配列で、右のラベルがstatData配列 - >The collectionview imageで、コレクションビューがどのように表示されるかを示しています。何か案は?コレクションビューにfirebase文字列値を追加しようとしています

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 

    } 


} 

答えて

0

あなたはあなたのコレクションのためのデータソースとして、あなたはあなたのstatDataが空の間、同じindexPathでその配列からとstatDataからオブジェクトを取得しようとしているcellForItemAt方法でstatHeaders配列を使用しています。それが原因でそのエラーが発生します。

あなたのコレクションが主にstatDataに依存していない場合は、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() 

     }) 
+0

これは完璧な答えです、どうもありがとう、私は数週間のためにこれを見てきました!最後にリロードを追加し、statData.count> indexPath.row { cell.statsLabel.text = statData [indexPath.row] }を追加しました。 – DannyV

関連する問題