Существует способ получить ячейку indexPath
(UICollectionView cellForItemAtIndexPath:
). Но я не могу найти способ получить одно из дополнительных представлений, таких как верхний или нижний колонтитул, после того, как он был создан. Любые идеи?
UICollectionView: как получить представление заголовка для раздела?
Ответ 1
UPDATE
Начиная с iOS 9, вы можете использовать -[UICollectionView supplementaryViewForElementKind:atIndexPath:]
, чтобы получить дополнительное представление по пути указателя.
ОРИГИНАЛ
Лучше всего сделать свой собственный словарь для сопоставления указательных путей дополнительным представлениям. В вашем методе collectionView:viewForSupplementaryElementOfKind:atIndexPath:
поместите представление в словарь перед его возвратом. В collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:
удалите вид из словаря.
Ответ 2
Я хотел бы поделиться своим пониманием решения, предоставленного 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];
он хранит только WEAK-ссылку на него в NSMapTable и сохраняет его как LONG, поскольку объект не освобождается!
Вам больше не нужно удалять вид из
collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:
поскольку NSMapTable потеряет запись, как только будет освобождено представление.
Ответ 3
Первое, что вам нужно сделать, - установить флажок "Заголовок раздела" в инспекторе атрибутов просмотра коллекции. Затем добавьте коллекцию повторно используемого вида так же, как вы добавили ячейку в представление коллекции, напишите идентификатор и сделайте для него класс, если вам нужно. Затем реализуем метод:
- (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, которые я сделал