Подтвердить что ты не робот

UICollectionView: как получить представление заголовка для раздела?

Существует способ получить ячейку indexPath (UICollectionView cellForItemAtIndexPath:). Но я не могу найти способ получить одно из дополнительных представлений, таких как верхний или нижний колонтитул, после того, как он был создан. Любые идеи?

4b9b3361

Ответ 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, которые я сделал