我有一个tableView,collectionViews嵌套在每个tableViewCell中。
每个tableViewCell都是电影类型,CollectionViewCell就是电影。
我试图告诉collectionView它是哪个TableView indexPath,以便它可以显示正确的数据。
我遇到的问题是,当您在collectionView(和TableView)中滚动时,数字会发生变化(collectionView单元格中有一个标签显示TableView indexPath.row)。另外,如果我滚动到第一个tableView单元格中collectionView的末尾,则第四个左右tableView cell中的collectionViewCell也将滚动到末尾,就好像它们是“链接的”。
为了得到嵌套的布局,我遵循这个tuthttps://youtu.be/4XnXHov2lQU
我最初是从TableViewCell类设置collectionView的,但正如视频中所解释的,这不符合MVC。
为了得到tableViewIndexPath我只需在TableViewcellForRowAt中设置一个变量,然后在collectionView中将标签设置为this。
当我看到其他问题并在上面回答时,正确的方法是什么?但几乎所有的问题都是一样的。
编辑-
表格视图控制器.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
    }

}

tableviewcell类.swift
class tableViewCellClass: UITableViewCell {
    @IBOutlet weak var collectionView: UICollectionView!

    var indexPathForCell: IndexPath?

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

最佳答案

您的问题显然缺少代码,但从您的描述来看,我认为您在单元重用方面存在问题。
假设您在第一个单元格向右滚动UICollectionView。如果在那之后,你开始向下滚动你的UITableView,你的UITableViewCells将被重复。因此,您的4thUICollectionView实际上是第一个被重用的单元。Reused表示它是同一个单元。由于您将第一个单元格向右滚动,它的CollectionView值与contentOffset值相同,看起来它是滚动的。
每个可重用单元都有一个可以重写的方法。在该方法中,可以将所有单元格参数重置为默认值。例如,我假设在table view cell类中有一个prepateForReuse()对象。那样的话,你需要做下一步

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

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

09-25 20:59