Tableview中的CollectionView,数据源

时间:2017-03-01 12:53:09

标签: ios arrays uitableview swift3 uicollectionview

我有一个uiviewcontroller,我在其中放置了一个带有自定义单元格的uitableview。这些单元格中的每一个都在uicollectionview内部,具有水平滚动。

我正在以编程方式工作,因此tableviewcell是collectionview的委托/数据源。

我的数据源结构是数组数组

对于每个tableviewcell,我的tableview都有一个tableview部分。使用数组,数据查看数据源方法可以正常工作。我能够正确设置tableview。 在这个单元格中,我想显示一个带有水平滚动的集合视图。

我遇到的问题是我无法使用数组正确分配数据源到collectionview。当我加载tableview并向下滚动时,我会看到重复的记录,所以例如正确显示前3行(就数据和项目数而言),但是从第4行开始,例如,数据是重复,所以我再次看到前3行的记录,当然这不一定发生,因为如果我滚动第4行(第4行的集合视图)应用程序崩溃由于索引问题范围。

这很容易理解:假设我在第一行有10个单元格,在第4行/或第4行有5个单元格,如您所愿...滚动第4行的集合视图将导致崩溃。这是因为错误的数据实际上与第一行相同:相反,我只有5个单元格要渲染......

我使用的Tecnique非常简单:给每个tableviewcell的标签指定实际的indexpath.section。然后在collectionview中,使用此标记循环遍历数组,然后使用indexpath.item获取正确的数组

让我们现在看一下代码:

泰伯维

func numberOfSections(in tableView: UITableView) -> Int {
    return DataManager.shared.datasource.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! DiarioTableViewCell
    cell.tag = indexPath.section

    return cell
}

TableviewCell

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: .default, reuseIdentifier: "cell")

    collectionView.register(DiarioCVCell.self, forCellWithReuseIdentifier: "cellCV")
    collectionView.delegate = self
    collectionView.dataSource = self

    DataManager.shared.istanzaCV = self.collectionView

    addSubview(tableCellBG)
    addSubview(collectionView)
    setConstraints()
}

的CollectionView

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

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

    let tvCell = collectionView.superview as! DiarioTableViewCell
    return DataManager.shared.datasource[tvCell.tag].count

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellCV", for: indexPath) as! DiarioCVCell

    let celltag = (collectionView.superview as! DiarioTableViewCell).tag

    cell.datasource = DataManager.shared.datasource[celltag][indexPath.item]

    return cell
}

注意我已经阅读了所有可能相关的线程,甚至是ashfurrow的文章,并且在堆栈中,但我无法找到解决方案。 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

尝试在显示单元格时重新加载集合视图。正在重复使用单元格以节省内存,因此它们只创建一次 - 您在init处设置所有数据并且它永远停留在那里。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! DiarioTableViewCell
    cell.tag = indexPath.section
    cell.collectionView.reloadData()
    cell.collectionView.collectionViewLayout.invalidateLayout() //just to be sure, maybe it's not necessary

    return cell
}