Похоже, у вас несколько проблем.
Каждый collectionView должен иметь свой делегат и источник данных, установленные в viewDidLoad или внутри Interface Builder. Каждая ячейка должна иметь свой уникальный идентификатор ячейки. В том виде, в котором это есть сейчас, все они имеют один и тот же точный идентификатор ячейки, который равен "Cell"
Почему бы просто не иметь 1 collectionView, который имеет 3 разных типа ячеек, и обновлять ячейку в зависимости от того, какое условие выполнено
@IBOutlet weak var mainCollectionView: UICollectionView!
let categoryCellId = "CategoryCollectionViewCell"
let productsCellId = "ProductsCollectionViewCell"
let slideMenuCellId = "SlidemenuCollectionViewCell"
viewDidLoad() {
mainCollection.delegate = self
mainCollection.datasource = self
// register your 3 nibs with this one cv
mainCollectionView.register(UINib(nibName: "CategoryCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: self.categoryCellId)
mainCollectionView.register(UINib(nibName: "ProductsCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: self.productsCellId)
mainCollectionView.register(UINib(nibName: "SlidemenuCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: self.slideMenuCellId)
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if someConditionOccurs {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.categoryCellId, for: indexPath) as! CategoryCollectionViewCell
// update cell ...
return cell
}
if anotherCondtionOccurs {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.productsCellId, for: indexPath) as! ProductsCollectionViewCell
// update cell ...
return cell
}
if a differntConditionOccurs {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.slideMenuCellId, for: indexPath) as! SlidemenuCollectionViewCell
// update cell ...
return cell
}
return UICollectionViewCell()
}
Если ячейки разного размера, вам нужно будет использовать один и тот же лог c внутри sizeForItem
. Для выделения используйте те же логи c в didSelectItem
Вы также можете разделить их на разделы вместо отдельных коллекций