32

有一种方法可以通过indexPath( UICollectionView cellForItemAtIndexPath:) 获取单元格。但我找不到一种方法来获取一个补充视图,如页眉或页脚,在创建后。有什么想法吗?

4

4 回答 4

49

更新

从 iOS 9 开始,您可以使用-[UICollectionView supplementaryViewForElementKind:atIndexPath:]通过索引路径获取补充视图。

原来的

您最好的选择是制作自己的字典映射索引路径到补充视图。在您的collectionView:viewForSupplementaryElementOfKind:atIndexPath:方法中,在返回之前将视图放入字典中。在您的collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:中,从字典中删除视图。

于 2012-11-16T04:40:36.197 回答
31

我想分享我对rob mayoff提供的解决方案的见解,但我不能发表评论,所以我把它放在这里:

对于每一个试图保持对集合视图正在使用的补充视图的引用,但由于以下原因而遇到过早丢失跟踪的问题的每一个人

collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:

被调用太多次,尝试使用 NSMapTable 而不是字典。

我用

@property (nonatomic, strong, readonly) NSMapTable *visibleCollectionReusableHeaderViews;

像这样创建:

_visibleCollectionReusableHeaderViews = [NSMapTable mapTableWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableWeakMemory];

这样当您保留对补充视图的引用时:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    // ( ... )
    [_visibleCollectionReusableHeaderViews setObject:cell forKey:indexPath];

它在 NSMapTable 中只保留对它的 WEAK 引用,并且只要对象没有被释放,它就会一直保留它!

您不再需要从中删除视图

collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:

因为一旦视图被释放,NSMapTable 就会丢失条目。

于 2014-07-12T02:47:24.597 回答
9

您要做的第一件事是在集合视图的属性检查器中选中“Section Header”框。然后添加一个集合可重用视图,就像您将单元格添加到集合视图一样,编写一个标识符并在需要时为其创建一个类。然后实现方法:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

从那里开始就像你对 cellForItemAtIndexPath 所做的那样指定它是你正在编码的页眉或页脚也很重要:

if([kind isEqualToString:UICollectionElementKindSectionHeader])
{
    Header *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerTitle" forIndexPath:indexPath];
    //modify your header
    return header;
}

else
{

    EntrySelectionFooter *footer = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"entryFooter" forIndexPath:indexPath];
    //modify your footer
    return footer;
}

使用 indexpath.section 来了解这是在哪个部分,还请注意 Header 和 EntrySelectionFooter 是我制作的 UICollectionReusableView 的自定义子类

于 2012-11-16T04:29:19.363 回答
3

这种方法通常足以达到重新加载屏幕补充视图的目的:

collectionView.visibleSupplementaryViews(ofKind: UICollectionElementKindSectionHeader)
于 2018-02-12T08:20:10.303 回答