Swift 中的 UICollectionView 自定义布局重新加载问题

Posted

技术标签:

【中文标题】Swift 中的 UICollectionView 自定义布局重新加载问题【英文标题】:UICollectionView Custom layout reloading issue in Swift 【发布时间】:2016-08-03 13:11:09 【问题描述】:

这是参考链接:

https://www.raywenderlich.com/107439/uicollectionview-custom-layout-tutorial-pinterest

我在UICollectionView最后一个单元格中实现了加载更多,数据正在下载,下载完成后我想重新加载集合

collectionView.collectionViewLayout.invalidateLayout()
self.collectionView.reloadData()

let concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(concurrentQueue) 
            DataManager.sharedInstance.homeRequest(Dictionary: params, onSuccess:  (dict) in
                self.downloadPageIndex +=  1
                let response = HomeObject(dictionary: dict)

                for (_,e) in (response.dataDict?.enumerate())!
                    self.dataArray.append(e)
                

                dispatch_async(dispatch_get_main_queue()) 

                    self.collectionView.reloadData()
                    self.collectionView.collectionViewLayout.invalidateLayout()

                
                self.activityIndicatorCell.stopAnimating()

                , onError:  (error) in
                    self.activityIndicatorCell.stopAnimating()

            )

喜欢这个collectionview reloadata

谁能帮帮我?

【问题讨论】:

这些行有什么问题?你有什么问题? 你能显示更多的负载吗?当您收到数据时会发生什么? Collectionview 没有重新加载 .... 显示更多代码,你在哪里调用这些行? 您可能在后台线程上获取数据。然而,UI 更新必须发生在主线程上。尝试在主线程上调用 reload 方法。希望这会有所帮助。 【参考方案1】:

遇到了你的问题,目前我也面临同样的问题,经过一番挖掘,我想通了!

问题出在PintrestLayout 文件中

在里面你会发现类似 (PROBLEM) 的代码:

guard cache.isEmpty == true, let collectionView = collectionView else return

基本上,如果您应用到 CollectionView 的属性是空的(它们在开始时),则将 PintrestLayout 应用到它,那就完美了! BUT 如果你正在重新加载数据并添加到collectionView,你需要再次应用布局,但是当你再次尝试将布局应用到collectionView时缓存不是空的,因此它返回并且没有根本不工作...

解决方案

将该代码替换为:

guard cache.isEmpty == true || cache.isEmpty == false, let collectionView = collectionView else 
        return
    

现在你说“我不在乎它是否为空,只需将该死的布局应用于我的 collectionView”

完成了!现在reloadData() 将更新您获得的单元格数量...

不过,如果您想让它更快,并减少一些内存等,这非常昂贵...然后查看 invalidateFlowLayout 文档。

【讨论】:

这也适用于未来面临这个问题的任何人! 这没有任何意义,是真是假? @JimTierney 你的权利。回过头来看,你所需要的只是看守检查它是否为零。布尔值的结果无关紧要! 非常感谢你救了我

以上是关于Swift 中的 UICollectionView 自定义布局重新加载问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 UICollectionView 自定义布局重新加载问题

UICollectionView 中的 Alamofire + Swift

Swift 中的 UICollectionView 自定义布局

Swift 3 中的 UICollectionView 自定义按钮操作

Swift 中的 UiSearchController 到 UiCollectionView

UIView 容器中的 Swift-UICollectionView