在表格视图中的所有单元格都已加载后,重新加载表格视图单元格内的集合视图

Posted

技术标签:

【中文标题】在表格视图中的所有单元格都已加载后,重新加载表格视图单元格内的集合视图【英文标题】:Reloading collection view inside a table view cell happens after all cells in table view have been loaded 【发布时间】:2016-03-10 05:47:42 【问题描述】:

我正在尝试在表格视图的每个表格视图单元格内实现一个集合视图,但无法让集合视图在正确的时间重新加载。看起来集合视图会在所有表格视图单元格加载后自行重新加载,而不是每次都有新单元格出列到表格视图中,因为我试图这样做。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    
    let cell = tableView.dequeueReusableCellWithIdentifier("LWTableViewCell") as! LWTableViewCell
    
    cell.collectionView.delegate = self
    cell.collectionView.dataSource = self
    
    if dataIsReady == 1 
        setIndex = indexPath.row
        print("in table view cellForRowAtIndexPath, setting setIndex at \(setIndex)")
        cell.collectionView.reloadData()
    
    return cell


func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    
    if dataIsReady == 1 
        print("In collection view numberOfItemsInSection setIndex is \(setIndex)")
        return self.model.sets[setIndex].subsets!.count
    
    else  return 0    

在终端中,我得到以下信息:

在表格视图 cellForRowAtIndexPath 中,设置 setIndex 为 0

在表格视图 cellForRowAtIndexPath 中,设置 setIndex 为 1

在表格视图 cellForRowAtIndexPath 中,设置 setIndex 为 2

在集合视图中 numberOfItemsInSection setIndex 为 2

在集合视图中 numberOfItemsInSection setIndex 为 2

在集合视图中 numberOfItemsInSection setIndex 为 2

而我希望看到以下事件顺序(假设集合视图重新加载方法是/应该在每次新的表视图单元出列时调用)。

在表格视图 cellForRowAtIndexPath 中,设置 setIndex 为 0

在集合视图中 numberOfItemsInSection setIndex 为 0

在表格视图 cellForRowAtIndexPath 中,设置 setIndex 为 1

在集合视图中 numberOfItemsInSection setIndex 为 1

在表格视图 cellForRowAtIndexPath 中,设置 setIndex 为 2

在集合视图中 numberOfItemsInSection setIndex 为 2

任何关于为什么会发生这种行为以及如何解决它的建议将不胜感激!

我查看了有关该主题的其他一些问题,并且知道有一些关于该主题的教程(例如,https://ashfurrow.com/blog/putting-a-uicollectionview-in-a-uitableviewcell-in-swift/),但在开始使用不同的方法之前,我想了解原因以上似乎不起作用/可以做些什么来使它起作用。

【问题讨论】:

您的代码不应依赖于这些调用的顺序。您遇到了什么问题? 我试图让特定表格视图单元格的集合视图中的单元格数等于“self.model.sets[setIndex].subsets!.count”,其中 setIndex是表格视图单元格的 indexpath.row。因此,当给定表格视图单元格的 collectionView 重新加载时,它将使用正确的 setIndex 来确定要显示的项目数。例如,如果 model.sets[0].subsets.count = 1,model.sets[1].subsets.count = 2,model.sets[2].subsets.count = 3,则三行上的集合视图在表格视图中将分别有 1、2 和 3 个项目。 【参考方案1】:

您不能依赖调用的顺序。目前,您正试图将表视图的cellForRowAtIndexPath 中的setIndex 传递给集合视图的委托方法。解决此问题的一种简单方法是,不要使用单个变量来传递行号,而是将其传递到集合视图的 tag 属性中。然后每个集合视图都会知道它的相关行号。即

在表格视图的cellForRowAtIndexPath:

cell.collectionView.tag = indexPath.row

然后在集合视图的numberOfItemsInSection:

return self.model.sets[collectionView.tag].subsets!.count

另请注意,您不需要在这些方法中测试dataIsReady。此代码仅在表格视图的tableView:numberOfRowsInSection: 中需要。当数据未准备好时,它应该返回 0(即没有行可显示)。因此 table view 的cellForRowAtIndexPath 永远不会被调用,并且由于没有行,所以没有集合视图,所以它们的numberOfItemsInSection 永远不会被调用。

【讨论】:

非常感谢!我现在可以让代码工作,而且它变得更加简单!

以上是关于在表格视图中的所有单元格都已加载后,重新加载表格视图单元格内的集合视图的主要内容,如果未能解决你的问题,请参考以下文章

在表格视图中重新加载数据而不损害动画

如何在编辑表格视图单元格中的文本字段时重新加载所有表格视图单元格 - iOS Swift

使用导致崩溃的搜索结果更新表视图

UIWebView 完成加载后,如何强制重新布局 UITableViewCell?

如何在表格视图中加载不同的自定义单元格

重新加载表格视图后出现最后一个静态单元格分隔线