Я был удивлен, узнав, сколько было препятствий для реализации UICollectionView в UITableViewCell. Поэтому этот туториал здесь, надеюсь он сэкономит вам много времени.
Примечание: это туториал не для начинающих. Предполагается, что вы знаете о tableViews и создании пользовательских ячеек с файлами xib.
Также я не описываю ничего, про визульную составляющую.
1) Добавьте UICollectionView к вашей TableViewCell Xib
1. Перетащите UICollectionView в ваш TableViewCell Xib
2. Добавить констрейны
3. И узнайте, что вы не можете добавить CollectionViewCells в свой недавно добавленный UICollectionView :)
Оказывается, вам нужен отдельный файл для размещения любых ячеек представления коллекции, которые вы хотите отобразить. (Когда ваш UICollectionView находится в Xib-файле)
2) Добавьте файл UICollectionViewCell и Xib в ваш проект
Вы можете делать все, что захотите, в своем ячейки коллекции Collection View Cell Xib (добавить label, image и тд.), для целей этого туториала мы это здесь не трогаем.
Убедитесь, что вы даете своей ячейке resuableIdentifier.
3) Убедитесь в соответствие вашего класса TableViewCell UICollectionView Data Source и Delegate протоколы.
Шаг 1: Вернитесь к вашему Xib-файлу tableViewCells.
Шаг 2: Перетащите из вашего collectionView в ‘File’s Owner’ и выберите dataSource и затем delegate.
Шаг 3: Перетащите из вашего collectionView в ваш класс TableViewCell и создайте IBOutlet
Шаг 4: Убедитесь в соответствие вашего класса TableViewCell UICollectionView Data Source и Delegate протоколы.class TableViewCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource {
@IBOutlet weak var collectionView: UICollectionView!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
self.collectionView.dataSource = self
self.collectionView.delegate = self
self.collectionView.register(UINib.init(nibName: «CollectionViewCell», bundle: nil), forCellWithReuseIdentifier: «collectionViewID»)
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 15
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: «collectionViewID», for: indexPath as IndexPath) as! CollectionViewCell
return cell
}
}
Пояснение к коду:
1) Добавьте UICollectionViewDelegate и UICollectionViewDataSource к описанию класса
2) Сделайте datasource collectionView и delegate = self в awakeFromXib
3) Добавьте функцию numberOfItemsInSection
4) Добавьте функцию cellForItemAt
5) Создайте ячейку с вашим reuseIdentifier как свою пользовательскую ячейку.
Действия по устранению неполадок:
1) Мои идентификаторы назначены и корректны?
2) Перетащил ли я из своего collectionView в Files Owner в вашем Xib-файле?
Если есть вопросы, пишите в комментариях.
Если это вам помогло или поможет в будещем поставьте лайк.
Надеюсь кому то это сэкономит очень много времени.