swift - CollectionViewCell 未显示从 Firebase 接收数据
问题描述
我必须用来自 firebase 的数据填充单元格。但它们不显示。帮助并解释我在哪里犯了错误。如何填写单元格数据?
class TrainingProgramViewController: UIViewController {
@IBOutlet weak var collectionView: UICollectionView!
//var trainingPrograms = TrainingProgram.fetchTrainingProgram()
var trainingPrograms = [TrainingProgram]()
let cellScale: CGFloat = 0.7
override func viewDidLoad() {
super.viewDidLoad()
fetchPrograms()
}
func fetchPrograms() {
Database.database().reference().child("programs").observe(.childAdded) { (snapshot) in
if let dict = snapshot.value as? [String: Any] {
print(dict)
let newTitle = dict["title"] as! String
print("Новый тайтл:" + newTitle)
let newDescription = dict["description"] as! String
let trainingCell = TrainingProgram(description: newDescription, title: newTitle)
self.trainingPrograms.append(trainingCell)
print(self.trainingPrograms)
}
}
}
}
extension TrainingProgramViewController: UICollectionViewDataSource {
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return trainingPrograms.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TrainingProgramCollectionViewCell", for: indexPath) as! TrainingProgramCollectionViewCell
let trainingProgram = trainingPrograms[indexPath.item]
cell.trainingPrograms = trainingProgram
return cell
}
这是一个模型:
class TrainingProgram
{
var description = ""
var title = ""
init(description: String, title: String) {
self.description = description
self.title = title
}
}
解决方案
您忘记重新加载您的 collectionView
func fetchPrograms() {
Database.database().reference().child("programs").observe(.childAdded) { (snapshot) in
if let dict = snapshot.value as? [String: Any] {
print(dict)
let newTitle = dict["title"] as! String
print("Новый тайтл:" + newTitle)
let newDescription = dict["description"] as! String
let trainingCell = TrainingProgram(description: newDescription, title: newTitle)
self.trainingPrograms.append(trainingCell)
print(self.trainingPrograms)
}
DispatchQueue.main.async {
self. collectionView.reloadData()
}
}
}
还设置
collectionView.delegate = self
collectionView.dataSource = self
在你的 collectionView 方法中
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TrainingProgramCollectionViewCell", for: indexPath) as! TrainingProgramCollectionViewCell
cell.titleLabel.text = trainingPrograms[indexPath.item].title
return cell
}
推荐阅读
- database - 针对营业时间的 DynamoDB 表设计
- docker - Docker compsoe 不能像 docker run 一样工作
- javascript - 运行nodejs服务器时如何调用函数
- python - How to type hint with an optional import?
- javascript - 动态添加时 Mdl 组件不起作用
- javascript - 是否存在使用 bind 不能满足使用 call 或 apply 的需要的情况?
- python - 识别日志消息的来源
- python - 如何以任何角度在上方并平行于一条线绘制文本?
- html - 隐藏指定状态的 HTML
- oracle - 我收到 Oracle 数据库错误 ORA-20004: Error is Raised in xxxxxxxxxxORA-06512: If the value for clientcode is null