UICollectionView:如何获取节的标题视图?

时间:2012-11-15 09:06:29

标签: iphone ios uicollectionview

有一种方法可以通过indexPathUICollectionView cellForItemAtIndexPath:)来获取单元格。但是,在创建之后,我找不到一种方法来获取一个补充视图,如页眉或页脚。任何想法?

4 个答案:

答案 0 :(得分:42)

更新

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

ORIGINAL

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

答案 1 :(得分:26)

我想分享一下我对 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将丢失该条目。

答案 2 :(得分: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的自定义子类

答案 3 :(得分:0)

此方法通常足以用于重新加载屏幕上的补充视图:

const source$ = this.api.get<CustomResponse>('events');

source$.pipe(
  first(),
  tap((res) => this.total = res.totalsize || 0),
  map((res) => res.list),
  isLastItemTheSame(this.items, 'eventid', this.items.length && !isReset)
).subscribe((items: IEvent[]) => {

    // if (this.items.length && !isReset) {

    //   if (items[items.length - 1].eventid === this.items[this.items.length - 1].eventid) {
    //     return;
    //   }
    // }

    this.items = isReset ? items : [...this.items, ...items];
  }, (err) => {

    if (err.status !== 401) {

      this.router.navigate(['dashboard']).then(() => {
        this.notifications.newNotification({message: this.translate.instant('NOTIFICATIONS.EVENTS.GET_LIST_ERROR'), theme: 'danger'});
      });
    }
  }
);