无法在嵌套的CollectionView中获取TableViewCell的indexPath

时间:2018-09-22 23:22:22

标签: ios swift uitableview uicollectionview

我有一个tableView,每个tableViewCell中都嵌套有collectionViews。 每个tableViewCell是电影类型,collectionViewCells是电影。 我试图告诉collectionView哪个TableView indexPath,以便它可以显示正确的数据。

我遇到的问题是,当您滚动浏览collectionView(和TableView)时,数字会发生变化(我在collectionView单元格中有一个标签,显示TableView indexPath.row)。同样,如果我在第一个tableView单元格中滚动到collectionView的末尾,则第4个左右的tableViewCell也会滚动到末尾,就像它们是“链接的”一样。

要获取嵌套的布局,我将按照以下说明https://youtu.be/4XnXHov2lQU 我最初是通过TableViewCell类设置collectionView的,但是如视频中所述,这不符合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 :(得分:1)

您的问题显然缺少代码,但是从您的描述来看,我认为您在单元格重用方面遇到了问题。

比方说,您在右侧的第一个单元格中滚动了UICollectionView。如果在那之后,您开始向下滚动UITableView,您的UITableViewCells将被撤消。因此,您的4th UICollectionView实际上将是第一个被重用的单元格。 Reused表示它是同一单元格。而且,由于您将第一个单元格向右滚动,因此它的CollectionView具有相同的contentOffset值,看起来像是在滚动。

每个可重复使用的单元格都有一个可以被覆盖的方法prepateForReuse()。通过这种方法,您可以将所有单元格参数重置为默认值。例如,我假设在您的表视图单元格类中,您有一个collectionView对象。在这种情况下,您需要执行下一步

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

此后,每个重复使用的单元格将自动返回其初始位置。此外,当您将表格视图滚动回到顶部时,第一个UICollectionView也将位于初始位置。

答案 1 :(得分:0)

在您的tableview单元格类中,添加collectionview委托和数据源的扩展,定义布局并配置collectionview单元。

在视图控制器类中,转到cellForRowAIndex并调用tableview单元格类的方法,例如configureCollectionView(at section:indexPath.row)//捕获行索引

请确保在tableview类中定义了configure方法,该方法用于设置collectionview委托,数据源并重新加载数据

这样做可以让您以似乎没有链接的方式保持每一行的滚动位置。