我有一个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()
}
}
答案 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委托,数据源并重新加载数据
这样做可以让您以似乎没有链接的方式保持每一行的滚动位置。