Невозможно получить indexPath TableViewCell в встроенном CollectionView - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть tableView с collectionViews, вложенными в каждую tableViewCell.Каждый tableViewCell - это жанр фильма, а collectionViewCells - это фильмы.Я пытаюсь сказать collectionView, какой TableView indexPath это так, чтобы он мог отображать правильные данные.

Проблема у меня заключается в том, как вы прокручиваете collectionView (и TableView) изменения чисел (I ')мы получили метку в ячейке collectionView, отображающую TableView indexPath.row).Также, если я прокручиваю до конца collectionView в первой ячейке tableView, collectionViewCell в 4-м или около того tableViewCell также будет прокручиваться до конца, как если бы они были «связаны».

Чтобы получить вложенный элементЯ следую этому макету https://youtu.be/4XnXHov2lQU Я бы изначально настроил collectionView из класса TableViewCell, но, как объяснено в видео, это не соответствует MVC.

Чтобы получить tableViewIndexPathЯ просто установил переменную в TableView cellForRowAt, а затем установил метку в collectionView на это.

Каков будет правильный способ сделать это, так как я видел другие вопросы и отвечал на это, но довольноМногие из них создают одну и ту же проблему.

РЕДАКТИРОВАТЬ - TableViewController.swift

class TableViewController: UITableViewController {

    var tableViewIndexPath = Int()

    override func viewDidLoad() {
        super.viewDidLoad()          
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

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

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 230
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as! tableViewCellClass

        tableViewIndexPath = indexPath.row

        cell.collectionView.dataSource = self
        cell.collectionView.reloadData()

        return cell
    }
}

extension TableViewController : UICollectionViewDataSource {

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

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


    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath)

        let title = cell.viewWithTag(4) as! UILabel
        title.text = String(tableViewIndexPath)

        return cell
    }

}

TableViewCellClass.swift

class tableViewCellClass: UITableViewCell {
    @IBOutlet weak var collectionView: UICollectionView!

    var indexPathForCell: IndexPath?

    override func prepareForReuse() {
        self.collectionView.contentOffset = .zero
        self.collectionView.reloadData()
    }
}

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

В своем классе ячеек табличного представления добавьте расширение делегата и источника данных коллекционного представления, определите макет и настройте ячейки коллекционного представления.

В своем классе контроллера представления перейдите к cellForRowAIndex и вызовите метод класса ячеек табличного представления, например configureCollectionView (at section: indexPath.row) // для захвата индекса строки

В своем классе табличного представления убедитесь, что вы определили метод configure, который устанавливает делегат коллекции данных, источник данных и перезагружает данные

Это позволитсохранять позиции прокрутки в каждой строке для прокрутки таким образом, чтобы это не казалось связанным.

0 голосов
/ 23 сентября 2018

В вашем вопросе явно не хватает кода, но из вашего описания я полагаю, что у вас есть проблема с повторным использованием ячеек.

Допустим, вы прокрутили UICollectionView в первой ячейке справа.Если после этого вы начнете прокручивать вас на UITableView вниз, ваш UITableViewCells будет отклонен.Таким образом, ваша 4th UICollectionView будет фактически первой ячейкой, которая была повторно использована.Reused означает, что это та же самая клетка.А поскольку вы прокручиваете первую ячейку вправо, ее CollectionView имеет то же значение contentOffset, и похоже, что оно было прокручено.

Каждая ячейка многократного использования имеет метод prepateForReuse(), который можно переопределить.В этом методе вы можете сбросить все параметры вашей ячейки на значения по умолчанию.Например, я предполагаю, что в вашем классе ячеек табличного представления у вас есть collectionView объект.В этом случае вам нужно сделать следующее

override func prepareForReuse() {
    self.collectionView.contentOffset = .zero
}

После этого каждая повторно использованная ячейка будет автоматически возвращена в исходное положение.Кроме того, когда вы будете прокручивать свой табличный вид вверх, первый UICollectionView будет также в начальной позиции.

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