Вложенная коллекция Вид внутри ячейки табличного представления swift iOS - PullRequest
1 голос
/ 24 января 2020

Я вложил collection view внутрь ячейки табличного представления. Мне нужно реализовать экран, похожий на экран магазина приложений Netflix. Если у вас есть такие категории, как enter image description here

Мне нужно загрузить данные из JSON, например - «Популярные» могут иметь 11 видео , «Действие» может иметь 3 видео, а «Приключения» может иметь 20. Таким образом, внутри каждой ячейки табличного представления это заданное c представление коллекции будет загружать различное количество ячеек представления коллекции в зависимости от того, сколько видео в каждой категории (Популярные , Action, Adventure), которая будет отображаться в собственном соответствующем горизонтальном представлении коллекции.

Пока что с моим кодом я отображаю название каждой категории в заголовке табличного представления. Но внутри этой категории, внутри представления коллекции numberOfItemsInSection и cellForItemAt , я не могу найти способ загрузки каждого представления коллекции взаимозависимо. Например, Сборное представление 1 , относящееся к Популярному, должно загружать 11 ячеек, Сборное представление 2 , относящееся к Действию, должно загружать 3 ячейки. Ниже приведен мой код

Мои методы просмотра таблиц, которые находятся внутри регулятора обзора

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "categoriesCell") as? CategoriesTableViewCell else { return UITableViewCell() }

    return cell
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

    return arrayOfCategoryObjects[section].title
}

func numberOfSections(in tableView: UITableView) -> Int {
    return arrayOfCategoryObjects.count
}

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    if let cell = cell as? CategoriesTableViewCell {


        cell.moviesCollectionView.dataSource = self
        cell.moviesCollectionView.delegate = self

        cell.moviesCollectionView.reloadData()

    }
}

Моя ячейка просмотра таблицы

class CategoriesTableViewCell: UITableViewCell {

@IBOutlet weak var moviesCollectionView: UICollectionView!

}

МОЙ КОЛЛЕКЦИЯ ПРОСМОТР ДЕЛЕГАТОВ, КОТОРЫЕ ТАКЖЕ ВНУТРИ КОНТРОЛЛЕРА ПРОСМОТРА *

func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
   // print(arrayOfCategoryObjects[section].movies[section])

    return arrayOfCategoryObjects[section].movies.count

  }

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {


        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "moviesCell", for: indexPath) as! MoviesCollectionViewCell

        cell.movieTitleLbl.text = arrayOfCategoryObjects[indexPath.item].movies[indexPath.item]

        return cell

  }

МОЙ КОЛЛЕКЦИЯ ПРОСМОТРА КЛЕТОК

class MoviesCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var movieTitleLbl: UILabel!

}

1 Ответ

1 голос
/ 24 января 2020

Вам необходимо установить тег для UICollectionView в качестве родителя UITableViewCell indexPath.section:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {

    if let cell = cell as? CategoriesTableViewCell {

        cell.moviesCollectionView.dataSource = self
        cell.moviesCollectionView.delegate = self
        cell.moviesCollectionView.tag = indexPath.section
        cell.moviesCollectionView.reloadData()

    }
}

, а затем в делегате вашего UICollectionView:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    return arrayOfCategoryObjects[collectionView.tag].movies.count

  }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "moviesCell", for: indexPath) as! MoviesCollectionViewCell

    cell.movieTitleLbl.text = arrayOfCategoryObjects[collectionView.tag].movies[indexPath.item]

    return cell

  }

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...