将UICollectionView连接到Firebase

时间:2016-11-20 22:28:58

标签: ios swift firebase uicollectionview

我对SO很新。我尝试使用Firebase数据库中的数据填充集合视图。从Firebase获取数据的Users var会返回所有数据。我想弄清楚为什么UICollectionView会回复Nil。我认为崩溃发生在这一行:

self.usersCollectionView.reloadData()

,错误是:

  

致命错误:在解包可选值时意外发现nil

我的collectionView var返回nil

我已将细胞类连接到细胞。

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
    }

    */

}

这是我的User var:

import UIKit

class User: NSObject {

    var name: String?
    var email: String?
    var password: String?
    var profileImageURL: String?

}

如果对我的代码有任何疑问或者您需要更多信息。请不要犹豫。

1 个答案:

答案 0 :(得分:1)

似乎您的collectionView未正确创建。你是如何在故事板中将它连接起来的?

您正在尝试重新加载collectionView,然后才能正确设置。