Ich bin ziemlich neu in SO. Ich versuche, eine Sammlungsansicht mit Daten aus einer Firebase-Datenbank zu füllen. Die Users-Variable, die Daten von Firebase abruft, kommt mit allen Daten zurück. Was ich versuche herauszufinden, warum meine UICollectionView
mit Nil
zurückkommt. Ich denke, dass der Absturz in dieser Zeile passiert:Verbinden von UICollectionView mit Firebase
self.usersCollectionView.reloadData()
und der Fehler ist:
fatal error: unexpectedly found nil while unwrapping an Optional value
Its my collectionView
var, die eine nil
ist zurück.
Ich habe die Zellklasse mit der Zelle verbunden.
import UIKit
import Firebase
class UserCollectionController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
var cellIdentifier = "User Cell"
var users = [User]()
@IBOutlet weak var usersCollectionView: UICollectionView!
func createAlert(title: String, message: String) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: { (action) in
self.dismiss(animated: true, completion: nil)
}))
self.present(alert, animated: true, completion: nil)
}
func fetchUser() {
FIRDatabase.database().reference().child("users").observe(FIRDataEventType.childAdded, with: { (snapshot) in
if let dictionary = snapshot.value as? [String: AnyObject] {
let user = User()
user.name = dictionary["name"] as! String?
user.profileImageURL = dictionary["profileImageURL"] as! String?
self.users.append(user)
DispatchQueue.main.async(execute: {
self.usersCollectionView.reloadData()
})
}
print(snapshot)
}, withCancel: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
fetchUser()
}
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
return users.count
}
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! UserCollectionViewCell
let cellUsers = users[indexPath.item]
//cell.users = users[indexPath.item]
cell.usersNameLabel.text = cellUsers.name
if let profileImageURL = cellUsers.profileImageURL {
cell.usersImageView.loadImageUsingCacheWithUrlString(urlString: profileImageURL)
}
return cell
}
public func numberOfSections(in collectionView: UICollectionView) -> Int
{
return 1
}
}
class UserCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var usersImageView: UIImageView!
@IBOutlet weak var usersNameLabel: UILabel!
/*
// MARK: - Public API
var users: User! {
didSet {
updateUI()
}
}
// MARK: - Private
//@IBOutlet weak var featuredImageView: UIImageView!
//@IBOutlet weak var interestTitleLabel: UILabel!
func updateUI() {
if let profileImage = users.profileImageURL {
self.usersImageView?.loadImageUsingCacheWithUrlString(urlString: profileImage)
}
usersNameLabel?.text! = users.name!
}
override func layoutSubviews() {
super.layoutSubviews()
self.layer.cornerRadius = 10.0
self.clipsToBounds = true
}
*/
}
Das ist mein User
var:
import UIKit
class User: NSObject {
var name: String?
var email: String?
var password: String?
var profileImageURL: String?
}
Wenn es irgendwelche Fragen zu meinem Code ist oder wenn Sie weitere Informationen benötigen. Bitte zögern Sie nicht zu fragen.
Können Sie versuchen zu sehen, was passiert, wenn Sie FIRDataEventType.childAdded zu FIRDataEventType.value ändern? –
Danke Jordi. Mein Code funktioniert tatsächlich. Es ist meine UICollectionView, die nicht die Zellen mit den Details zeigt. Entschuldigung, ich dachte, es war die Verbindung zur Datenbank, die nicht funktionierte. Ich habe einen Druck (Benutzer) gemacht und es hat die Benutzer auf der Konsole gedruckt. –
Es scheint, dass Ihre CollectionView nicht ordnungsgemäß erstellt wurde. Wie hast du es im Storyboard verbunden? –