有一种方法可以通过indexPath
(UICollectionView cellForItemAtIndexPath:
)来获取单元格。但是,在创建之后,我找不到一种方法来获取一个补充视图,如页眉或页脚。任何想法?
答案 0 :(得分:42)
从iOS 9开始,您可以使用-[UICollectionView supplementaryViewForElementKind:atIndexPath:]
通过索引路径获取补充视图。
最好的办法是将自己的字典映射到补充视图的索引路径。在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'});
});
}
}
);