のUICollectionView
コンテンツを表示する がありNSFetchedResultsController
ます。collectionView には 1 つのセクションがあり、そのセクションにはヘッダーがあります。ヘッダーを使用すると、ユーザーはコレクション ビューでコンテンツをフィルター処理できます。ヘッダー ビューのデリゲートはUIViewController
、コレクション ビューを含む に接続されます。
ユーザーがフィルター オプションの 1 つを変更するとすぐに、ヘッダー ビューはデリゲートにメッセージを送信します。デリゲートは、 および の呼び出しの述語を変更fetchRequest
しNSFetchedResultsController
ます-[NSFetchedResultsController performFetch:]
。次に、コンテンツが変更されたことをコレクション ビューに通知する必要があります。これにはいくつかの方法がありますが、私が好む方法は を呼び出すこと-[UICollectionView reloadData]
です。残念ながら、このメソッドは期待どおりには機能しません。このメソッドを呼び出すと、コレクション ビュー全体が消えてしまいます。これらは、この問題に関して私が行った観察の一部です。
- 最初の (そして唯一の) セクションのすべてのセルとヘッダーには、
hidden
フラグが に設定されていYES
ます。にシンボリックブレークポイントを設定して、どのメソッドがこれを引き起こしたのかを追跡しようとしました-[UIView setHidden:]
。残念ながら、UICollectionView
サブビュー内で壊れることはありません。 collectionView:cellForItemAtIndexPath:
を呼び出した後に呼び出されることはありません-[UICollectionView reloadData]
。collectionView:viewForSupplementaryElementOfKind:atIndexPath:
を呼び出した後に呼び出されることはありません-[UICollectionView reloadData]
。numberOfSectionsInCollectionView:
は引き続き呼び出され、正しい番号 (この場合は 1) を返します。collectionView:numberOfItemsInSection
は引き続き呼び出され、正しい番号 (この場合は 1) を返します。
問題を解決するためにこれまでに試したこと:
- インスタンスのすべてのカスタマイズ (
sectionInset
、itemSize
) を無効にするUICollectionViewFlowLayout
- インスタンスのすべてのカスタマイズ (
separatorInset
) を無効にするUICollectionView
- ヘッダーをサブビューとして追加し、それに応じ
UICollectionView
て設定しcontentInset
ます。残念ながらUICollectionView
、自動レイアウトの制約とクラッシュを和らげるのが好きではありません。 [UICollectionView reloadSections:]
の代わりに呼び出します[UICollectionView reloadData]
。これは機能しますが、アニメーションが好きではありません。- 最初のセクションの行を手動で挿入、削除、および更新します。これは、コレクション ビューを含むビュー コントローラーがメモリ内にある限り機能します。割り当てが解除されるとすぐに、アプリは でアサーション エラーでクラッシュし
-[UICollectionView dealloc]
ます。
このようにヘッダーを設定するのは適切ではありませんが、残念ながら( )UICollectionView
のようなグローバル ヘッダーはありません。 UITableView
tableHeaderView