我在Swift编程方面几乎是新手。我正在使用Swift 3和Xcode的最新版本,我正在尝试做一些对你们所有人来说都很容易的事情,所以在这里:
我正在尝试使用从Firebase数据库中检索到的数据动态填充TableView。为此,我设计了一个Prototype单元,它包含一个UIImageView,一些UILabel和一个Stepper。我认为在生成时不需要编辑Stepper和其中一个UILabel。但我需要放置一张图片并编辑2个UILabels。这是我试图这样做的方式:
hash = Hash.new(0)
p hash["pikachu"]
#=> 0
当我运行应用程序时,这是我发现的错误:
无法将'UITableViewCellContentView'(0x10442bff8)类型的值转换为'UIImageView'(0x10441c738)。
但是有一些不错的东西,我知道从Firebase中正确地检索数据,导致它在生成TableView单元格之前打印在控制台上。
先谢谢你,伙计们!
答案 0 :(得分:2)
似乎tableview单元格的内容视图已经标记为0。你可以给图像视图另一个标签号甚至更好:创建一个自定义子类并将@IBOutlets连接到单元格。这使得它更安全,您甚至可以在访问视图时获得自动完成功能。
答案 1 :(得分:1)
我的朋友创建了一个UITabelViewCell
子类,并为您的UIImageView
和UILabel
连接了IBOutlets,并在cellForRowAt
中调用它们。这是正确的做法。
以下是:
创建UITableViewCell子类
点击文件--->新---> Cocoa Touch --->然后选择UITableViewCell
的子类并记下该类的名称,例如:ProductsTableViewCell
单击故事板中的动态单元格原型,然后单击自定义类中的标识检查器,将类名更改为ProductsTableViewCell
在单元格中添加UIImageView和UILabel,然后在ProductsTableViewCell.swift文件中为它们创建IBOutlets。我们在第一步中创建的子类。
现在在cellForRowAt
函数中调用此原型单元格的IBOutlets并更改其内容。
示例代码:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellId) as! ProductsTableViewCell
cell.imageView.image = downloadImageProductFromFirebase(append: imageDict["hash"] as! String)
cell.nameLabel.text = productList[indexPath.row].name
cell.priceLabel.text = "" + (productList[indexPath.row].price?.description)!
return cell
}