重新加载UICollectionView页眉或页脚?

aka*_*aru 34 ios6 uicollectionview

我有一些数据是在另一个更新UICollectionView标头的线程中获取的.但是,我没有找到一种重新加载补充视图(如页眉或页脚)的有效方法.

我可以打电话collectionView reloadSections:,但这会重新加载整个部分,这是不必要的.collectionView reloadItemsAtIndexPaths:似乎只针对细胞(不是补充观点).并且调用setNeedsDisplay标题本身似乎也不起作用.我错过了什么吗?

Sar*_*den 26

你也可以使用(懒惰的方式)

collectionView.collectionViewLayout.invalidateLayout() // swift

[[_collectionView collectionViewLayout] invalidateLayout] // objc
Run Code Online (Sandbox Code Playgroud)

更复杂的是提供背景

collectionView.collectionViewLayout.invalidateLayout(with: context) // swift

[[_collectionView collectionViewLayout] invalidateLayoutWithContext:context] // objc
Run Code Online (Sandbox Code Playgroud)

然后,您可以自己创建或配置上下文以通知应更新的内容,请参阅:UICollectionViewLayoutInvalidationContext

它有一个功能,您可以覆盖:

invalidateSupplementaryElements(ofKind:at:) // swift
Run Code Online (Sandbox Code Playgroud)

  • 这会重新加载整个布局.无论补充意见与否. (4认同)
  • 这应该是接受的答案 (3认同)
  • 这是一个更合适的答案:http://stackoverflow.com/questions/26998761/uicollectionview-is-there-a-way-to-reload-only-the-supplementary-views (2认同)

Bob*_*ork 10

我刚遇到同样的问题,最后我用标签查找视图来编辑标签:

UICollectionReusableView *footer = (UICollectionReusableView*)[self.collectionView viewWithTag:999];
UILabel *footerLabel = (UILabel*)[footer viewWithTag:100];
Run Code Online (Sandbox Code Playgroud)

就像你说的那样,没有必要重新加载整个部分,这也取消了细胞上的任何动画.我的解决方案并不理想,但它很容易.

  • KVO旁边最差的回答 (4认同)
  • @akaru它对我来说很好.不知道为什么会有内存问题,因为它只是一个标签. (3认同)

Kli*_*akM 9

斯威夫特 3/4/5版本:

collectionView.collectionViewLayout.invalidateLayout()
Run Code Online (Sandbox Code Playgroud)

警告!

如果您同时更改collectionView项目数(例如,仅当所有单元格都已加载时才显示页脚),它将崩溃。您需要先重新加载数据,以确保之前和之后的项目数相同invalidateLayout()

collectionView.reloadData()
collectionView.collectionViewLayout.invalidateLayout()
Run Code Online (Sandbox Code Playgroud)


小智 2

您可以通过以下两种方法来做到这一点。

1. 创建一个可变模型来支持最终可用的数据。在 UICollectionReusableView 的继承类中使用 KVO 来观察更改并在新数据可用时使用新数据更新标题视图。

[model addObserver:headerView
        forKeyPath:@"path_To_Header_Data_I_care_about"
           options:(NSKeyValueObservingOptionNew |
                    NSKeyValueObservingOptionOld)
           context:NULL];
Run Code Online (Sandbox Code Playgroud)

然后在标题视图中实现监听器方法

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
Run Code Online (Sandbox Code Playgroud)

2. 将通知侦听器添加到视图,并在数据成功可用时发布通知。缺点是它的应用范围很广,而且设计不干净。

// place in shared header file
#define HEADER_DATA_AVAILABLE @"Header Data Available Notification Name"

// object can contain userData property which could hole data needed. 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(headerDataAvailable:) name:HEADER_DATA_AVAILABLE object:nil];

[[NSNotificationCenter defaultCenter] postNotificationName:HEADER_DATA_AVAILABLE object:nil];
Run Code Online (Sandbox Code Playgroud)