我有一个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
将被重复。因此,您的4th
UICollectionView
实际上是第一个被重用的单元。Reused
表示它是同一个单元。由于您将第一个单元格向右滚动,它的CollectionView
值与contentOffset
值相同,看起来它是滚动的。
每个可重用单元都有一个可以重写的方法。在该方法中,可以将所有单元格参数重置为默认值。例如,我假设在table view cell类中有一个prepateForReuse()
对象。那样的话,你需要做下一步
override func prepareForReuse() {
self.collectionView.contentOffset = .zero
}
之后,每个重复使用的单元将自动返回到其初始位置。另外,当您将表视图滚动回顶部时,第一个
collectionView
也将位于初始位置。