将 FirebaseUI-IOS 与自定义 UICollectionViewCell 一起使用时出错

Posted

技术标签:

【中文标题】将 FirebaseUI-IOS 与自定义 UICollectionViewCell 一起使用时出错【英文标题】:Getting error when using FirebaseUI-IOS with custom UICollectionViewCell 【发布时间】:2015-08-18 15:11:56 【问题描述】:

我在我的 ios 应用中使用 Firebase-UI-IOS。当我运行该应用程序时,我收到以下错误:

致命错误:“在展开 Optional 时意外发现 nil 价值”。

这是我在ViewDidLoad中的代码:

    let ref = Firebase(url: "https://XXXXXX.firebaseio.com")
    var dataSource: FirebaseCollectionViewDataSource!
        let messageRef = ref
        .childByAppendingPath("brainstorms")
        .childByAppendingPath(invite.brainstormId)
        .childByAppendingPath("messages")

    self.dataSource = FirebaseCollectionViewDataSource(ref: messageRef, cellClass: MessageCollectionViewCell.self, reuseIdentifier: "messageCell", view: self.collectionView)

    self.dataSource.populateCellWithBlock  (cell: UICollectionViewCell, obj: NSObject) -> Void in
        // Populate cell as you see fit
        if let cell = cell as? MessageCollectionViewCell 
            println(cell)
            cell.messageText.text = "Hello world" <--- ERROR HERE
        
    

    self.collectionView.dataSource = self.dataSource

我试图解开 cell.messageText,但它总是返回 nil。我的单元班MessageCollectionViewCell 已在我的故事板中注册。

我的println(cell) 打印以下行:&lt;xxxxx.MessageCollectionViewCell: 0x7fc26d8d9080; baseClass = UICollectionViewCell; frame = (17.5 155; 340 80); layer = &lt;CALayer: 0x7fc26d8d92e0&gt;&gt;

这在我看来应该可以工作。可以参考populateCellWithBlockhere。

有人有什么建议吗?

【问题讨论】:

【参考方案1】:

这里是 FirebaseUI 的创建者。

FirebaseUI 部分看起来工作正常(我们的合同将返回一个填充单元格,它是UICollectionViewCell 的子类和一个对象,它是NSObject 的子类,它似乎正在工作)。

问题似乎是在您的自定义单元格中没有正确初始化UILabel。能否请您发布您的MessageCollectionViewCell.swift 文件?

它应该看起来像这样:

import Foundation
import UIKit

class MessageCollectionViewCell: UICollectionViewCell 

    @IBOutlet var mainLabel: UILabel?

    override init(frame: CGRect) 
        super.init(frame: frame)

        // Custom initialization code for label
        let size = self.contentView.frame.size
        let frame = CGRectMake(0.0, 0.0, size.width, size.height)
        self.mainLabel = UILabel(frame: frame)

        // Make sure you add the label as a subview
        self.contentView.addSubview(self.mainLabel!)
    

  required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
    


收到init(frame:) 调用后,它应该会正确填充。

我使用以下populateCellWithBlock 对此进行了测试:

dataSource.populateCellWithBlock  (cell: UICollectionViewCell, snap: NSObject) -> Void in
    let cell: MessageCollectionViewCell = cell as! MessageCollectionViewCell

    cell.mainLabel?.text = "Hello!"
 

我正在努力添加__kindof 支持以使签名看起来更像:

dataSource.populateCellWithBlock  (cell: MessageCollectionViewCell, snap: Message) -> Void in
    cell.mainLabel?.text = "Hello!"
 

但是对__kindof 的支持似乎参差不齐,并且没有真正起作用(XCode 7 Beta 5 声称有支持,但我无法让 Cocoapods + Swift 接受它,即使它构建在 XCode 中并在 Objective 中工作-C)。

如果您对 FirebaseUI 有任何其他反馈,请告诉我,如果您发现任何其他错误,请随时将它们添加到 issue tracker :)

【讨论】:

感谢您的回复,这似乎工作。使用 addSubview() 时,我是否有机会保留我在 Storyboard 中的约束? 如果您使用 XIB 版本的构造函数,它将从您已经创建约束的 XIB 中提取所有内容,不需要 init(frame: )(因为它调用 awakeFromNib)。

以上是关于将 FirebaseUI-IOS 与自定义 UICollectionViewCell 一起使用时出错的主要内容,如果未能解决你的问题,请参考以下文章

firebaseui-ios FirebaseTableViewDataSource 与 UITableView 同步

将 NSViewController 与自定义视图一起使用

将 Tailwind 深色变体与自定义类一起使用

Qt 将信号与自定义插槽匹配

将 IdentityServer4 与自定义配置 DBContext 一起使用

为啥将 std::sort 与自定义比较器一起使用无法编译?