web-dev-qa-db-ja.com

UICollectionView:セクションのヘッダービューを取得する方法は?

indexPathUICollectionView cellForItemAtIndexPath:)。しかし、「作成された後、ヘッダーまたはフッターのような補足ビューの1つを取得する方法を見つけることができません。アイデアはありますか?

29
Dorian Roy

更新

IOS 9では、 -[UICollectionView supplementaryViewForElementKind:atIndexPath:] インデックスパスによる補足ビューを取得します。

元の

最善の策は、インデックスパスを補足ビューにマッピングする独自の辞書を作成することです。あなたのcollectionView:viewForSupplementaryElementOfKind:atIndexPath:メソッド、ビューを辞書に入れてから返す。あなたのcollectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:、ビューを辞書から削除します。

42
rob mayoff

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は、ビューの割り当てが解除されるとすぐにエントリを失うためです。

26
Bluezen

最初に行う必要があるのは、コレクションビューの属性インスペクターの[セクションヘッダー]ボックスをオンにすることです。次に、セルをコレクションビューに追加したのと同じように、コレクションの再利用可能なビューを追加し、必要に応じて識別子を記述し、そのクラスを作成します。次に、メソッドを実装します。

- (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のカスタムサブクラスであることに注意してください。

9
Alex

この方法は、多くの場合、画面上の補助ビューを再ロードする目的に十分です。

collectionView.visibleSupplementaryViews(ofKind: UICollectionElementKindSectionHeader)
0
ullstrm