问题:
给UICollectionView添加一个下拉刷新控件(UIRefreshControl),添加完下拉刷新执行方法后下拉不刷新
尝试方法:
1:直接添加self.reloadInputViews()
看到有人讲reloadData()方法不能直接调用,需要调用该方法,试过不行
2:添加reloadSections()
方法
我看到这个方法时猜想应该可以。遂添加,添加完下拉刷新居然先闪屏?重要的是数据并没有刷新,弃之
3:添加cell.setNeedsLayout()
方法
猜想这个方法也可以,都已经重新绘制了应该可以刷新数据。遗憾的是仍然不行
猜想过程:
上面几个方法试过后均不行,仍然寻找。看到了一个这样的帖子,里面内容讨论的是不是因为代理方法没走而导致数据没刷新的结果。这给了思路。UICollectionView能接触到数据源的地方无外乎就那几个代理方法,每个方法里面都打印来排查应该没问题。检查过程如下:
- 在未下拉刷新前打印数据源的数据(初始化数据)
- 在更新数据的方法更新后立刻打印数据(更新前先调用
removeAll()
) - reloadData()方法调用后立刻打印数据源内的数据
- 在DataSource内的返回cell对象的方法内打印数据源的数据
检查结果如下:
- 第一步检查数据正常,为初始化数据
- 第二步检查数据正常,为更新数据
- 第三步检查数据正常,为更新数据
- 第四步检查数据异常,为初始化数据
现在问题很明了,在非UICollectionView的回调方法内数据都正常,但其回调方法内数据却没更新,问题就出在这了。
解决方法:
先扯一句题外话,Android里面RecyclerView控件可以通setAdapter()
设置数据源来达到更新数据的效果(不推荐,正确做法是先更新泛型集合,再notify),DataSource与Adapter的作用力不是类似的吗?通过重新设置DataSource对象行不行?
dataSource = DataSource(dataSource: dataArray)
self.collectionView.dataSource = dataSource
self.collectionView.reloadData()
试了一下可以正常运行。遂多下拉几下刷新(Android里面过于频繁设置Adapter会造成适配器异常),也没事。当然这只是目前的缓兵之计,限于时间原因并没有深入研究,有兴趣的读者可共同探讨。