将 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)
打印以下行:<xxxxx.MessageCollectionViewCell: 0x7fc26d8d9080; baseClass = UICollectionViewCell; frame = (17.5 155; 340 80); layer = <CALayer: 0x7fc26d8d92e0>>
。
这在我看来应该可以工作。可以参考populateCellWithBlock
here。
有人有什么建议吗?
【问题讨论】:
【参考方案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 同步