目标: 当用户单击按钮时,从 Firebase 获取结果并将其呈现在 CollectionView 中。
现在做什么:
当我第一次进入应用程序时,我向 Firebase 发出请求并得到响应,一切都按原样绘制,单元格就位,集合也是。我的单元格是定制的,并在.xib
一个文件中制作。现在我已经实现了获取其他信息的逻辑,我只更改了一个词,以便从 firebase 接收到的数据已经不同。在调试器中,我检查了单击后 DataSource 中的数组是否包含新数据,逻辑工作正常,但之后collectionView.reloadData()
没有任何反应。没有错误。只有没有检查nil,然后是的,应用落在collectionView上
根据调试器:collectionView - nil
, numberOfItemsInSection
- 没有被调用并且单元格没有更新(因此,UI也没有更新)..
我尝试了什么:我有
在后台线程中接收数据的代码,reloadData
我在主线程中完成了它,我删除了线程,因为我认为线程存在问题 - 它没有帮助。我试图找到解决方案,大多数答案类似于:“您正在尝试在后台线程中更新数据”或“您有一个非 IB 集合”等等,不适用于我的问题。
代码: 我会尝试发布您需要的内容。
// метод который срабатывает при получение интерактива от пользователя, как я сказал
// до строчки с reload все работает, а после ничего не происходит
DispatchQueue.global(qos: .userInitiated).async {
self.db.collection(K.FStore.collectionName!)
.order(by: "date", descending: true)
.addSnapshotListener { (querySnapshot, error) in
if let e = error {
print("Ошибка при получение карточек \(e)")
} else {
self.cards = []
if let snap = querySnapshot?.documents {
for item in snap {
let data = item.data()
if let fio = data[K.FStore.fullName] as? String, let price = data[K.FStore.price] as? String, let phone = data[K.FStore.phone] as? String, let description = data[K.FStore.description] as? String, let address = data[K.FStore.address] as? String {
let newCard = Card(fio: fio, phone: phone, price: price, description: description, address: address, idCard: item.documentID)
self.cards.append(newCard)
}
}
DispatchQueue.main.async {
self.collectionView?.reloadData()
}
}
}
}
}
// self.cards - это массив Card, где есть определенная информация по карточке, потом Card я сделал в Cell ( т.е. кастомная ячейка - это карточка
// UICollectionViewDataSource
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return cards.count
}
//cellForItemAt
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cardCell: Card
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: K.cellMainScreenIndet, for: indexPath) as! MainCellCollectionView
cardCell = cards[indexPath.row]
cell.fioLabel.text = cardCell.fio
cell.priceLabel.text = cardCell.price
cell.addressLabel.text = cardCell.address
cell.discriptionLabel.text = cardCell.description
cell.phoneLabel.text = cardCell.phone
return cell
}
希望对您有所帮助,因为初学者仍然是完整的,我不明白我在哪里犯了错误以及为什么该语言会这样工作!
从这里获得源代码
为了:
let vc: MainViewController = MainViewController()
的,而 collectionView 是@IBOutlet,如果从情节提要启动应该像这样MenuViewController
一个完全不同的情况下MainViewController
被管理,为了管理必要的MainViewController
,一个人必须以某种方式了解自己,例如,重新定义prepare for segue
如下并
MenuViewController
替换在