indexPath
(UICollectionView cellForItemAtIndexPath:
)。しかし、「作成された後、ヘッダーまたはフッターのような補足ビューの1つを取得する方法を見つけることができません。アイデアはありますか?
IOS 9では、 -[UICollectionView supplementaryViewForElementKind:atIndexPath:]
インデックスパスによる補足ビューを取得します。
最善の策は、インデックスパスを補足ビューにマッピングする独自の辞書を作成することです。あなたのcollectionView:viewForSupplementaryElementOfKind:atIndexPath:
メソッド、ビューを辞書に入れてから返す。あなたのcollectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:
、ビューを辞書から削除します。
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は、ビューの割り当てが解除されるとすぐにエントリを失うためです。
最初に行う必要があるのは、コレクションビューの属性インスペクターの[セクションヘッダー]ボックスをオンにすることです。次に、セルをコレクションビューに追加したのと同じように、コレクションの再利用可能なビューを追加し、必要に応じて識別子を記述し、そのクラスを作成します。次に、メソッドを実装します。
- (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のカスタムサブクラスであることに注意してください。
この方法は、多くの場合、画面上の補助ビューを再ロードする目的に十分です。
collectionView.visibleSupplementaryViews(ofKind: UICollectionElementKindSectionHeader)