FirebaseUI:致命错误:在展开可选值时意外发现nil使用Storyboards和UI Label

时间:2016-09-23 02:28:05

标签: ios swift firebase firebaseui

在使用FirebaseUI时,我正在尝试从firebase为我的数据实现自定义单元格。我希望在单元格中有一些自定义标签,如下所示:

enter image description here

以下是我的集合视图控制器的样子:

import UIKit
import Firebase
import FirebaseDatabaseUI
private let reuseIdentifier = "Cell"

class ShowDogsCollectionViewController: UICollectionViewController {

let firebaseRef = FIRDatabase.database().reference().child("dogs")
var dataSource: FirebaseCollectionViewDataSource!

override func viewDidLoad() {
    super.viewDidLoad()

    self.dataSource = FirebaseCollectionViewDataSource(ref: self.firebaseRef, cellClass: DogCollectionViewCell.self, cellReuseIdentifier: reuseIdentifier, view: self.collectionView!)

    self.dataSource.populateCell { (cell: UICollectionViewCell, obj: NSObject) -> Void in
        let snap = obj as! FIRDataSnapshot
        let dogCell = cell as! DogCollectionViewCell

        dogCell.backgroundColor = UIColor.green
        print(snap.childSnapshot(forPath: "name"))

      // The line below should set the label text for one of the labels on our custom UICollectionCell Class, however it unwraps to nil.
      // fatal error: unexpectedly found nil while unwrapping an Optional value
      // dogCell.dogAge.text = "woot"

    }
    self.collectionView?.dataSource = self.dataSource
 }
 override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
 }
}

这是我的自定义单元类。真正的简单。

import UIKit

class DogCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var dogName: UILabel!
    @IBOutlet weak var dogAge: UILabel!
    @IBOutlet weak var dogToy: UILabel!

}

我已经在github上发布了代码:

https://github.com/thexande/firebaseCustomUICollectionViewCellDemo

以及描述此问题的视频:

https://youtu.be/q_m-bgofOb4

我已经选择了对这个问题的回答,所有似乎都涉及XIB,而不是故事板。故事板不可能这样做吗?

全部谢谢!!!

1 个答案:

答案 0 :(得分:1)

好。因此,在尝试一段时间后,我发现了它。

您需要按self.dataSource = FirebaseCollectionViewDataSource(ref: self.firebaseRef, prototypeReuseIdentifier: reuseIdentifier, view: self.collectionView!)

设置dataSource

具有 prototypeReuseIdentifier 的那个。否则,您没有使用DogCollectionViewCell,而是创建了一个没有标签元素的UICollectionViewCell的新实例。这就是为什么你试图设置它的.text属性来获得nil。

然后,您可以按代码dogCell.dogAge.text = "woot"设置年龄。

enter image description here

override func viewDidLoad() {
    super.viewDidLoad()

    self.dataSource = FirebaseCollectionViewDataSource(ref: self.firebaseRef, prototypeReuseIdentifier: reuseIdentifier, view: self.collectionView!)

    self.dataSource.populateCell { (cell: UICollectionViewCell, obj: NSObject) -> Void in
        let snap = obj as! FIRDataSnapshot
        let dogCell = cell as! DogCollectionViewCell
        dogCell.backgroundColor = UIColor.green

        dogCell.dogAge.text = "woot"

    }
    self.collectionView?.dataSource = self.dataSource
}

获取快照的值:

let nameSnap = snap.childSnapshot(forPath: "name")            
dogCell.dogName.text = nameSnap.value! as? String

enter image description here