我正在尝试将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
}
}
答案 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()
})