我正在研究iOS应用,它需要从Firebase提取数据并在表格视图中显示。为了给它一个自定义设计,我创建了一个自定义表视图单元类。当我试图在“populateCellWithBlock”方法中显示firebase返回的数据时,应用程序会崩溃,显示以下错误:
无法将'UITableViewCell'(0x10a73f9f0)类型的值转换为'EFRideSharing.RideTableViewCell'(0x108117f20)。
dataSource = FirebaseTableViewDataSource(ref: ref, cellReuseIdentifier: "rideCell", view: self.ridesTableView)
dataSource.populateCellWithBlock
{ (cell,snapshot) -> Void in
let tvc: RideTableViewCell = cell as! RideTableViewCell
let snapshot: FDataSnapshot = snapshot as! FDataSnapshot
tvc.toLabel.text = snapshot.value["time"] as? String
}
任何想法如何使它工作?
更新:附加代码
class RideTableViewCell: UITableViewCell {
@IBOutlet weak var timeLabel: UILabel!
@IBOutlet weak var toLabel: UILabel!
@IBOutlet weak var fromLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
答案 0 :(得分:2)
FirebaseUI-iOS的作者。
由于UITableViewCell
返回的单元格的默认类别为{{},因此问题是我们返回RideTableViewCell
而不是FirebaseTableViewDataSource
。 1}}当UITableViewCell
属性未设置时。
您可以使用包含cellClass
的构造函数的版本来解决此问题:
cellClass
这将允许我们将对象的适当演员版本返回给您。此外,为了解决在人口中静态知道细胞类型的问题,w可以做到以下几点。
在Objective-C中,这非常简单,因为我们可以给块中的属性赋予不同的类型:
dataSource = FirebaseTableViewDataSource(ref: ref, cellClass: RideTableViewCell.self, cellReuseIdentifier: "rideCell", view: self.ridesTableView)
因为我们使用[self.dataSource populateCellWithBlock:^(YourCustomCellClass *cell, FDataSnapshot *snap) {
// Populate cell as you see fit
}];
作为可用的参数(__kindof UITableViewCell
当没有,所以预先XCode 7),这种行为在任何版本的XCode中都有效,因为XCode将接受&#34 ;是的,这个类是UITableViewCell的一个子类" (> = XCode 7)或"如果它id
我仍然可以向其发送消息,那么我将允许它" (< = XCode 6.4)。
id
获得合理的预制版本的细胞。也就是说,我一直都会遇到错误,说方法签名与dataSource.populateCellWithBlock{ (cell: YourCustomClass, snapshot: FDataSnapshot) -> Void in
// Populate cell as you see fit
}
与AnyObject
的比较不匹配,并将其与YourCustomClass
的Apple问题相提并论,这是我所知道的记录最少的功能之一。如果有人对为什么会出现这种情况有任何想法,或者知道更好的文档,我很乐意听到它的来源(或者如果它在XCode 7的GM版本中得到修复)。