我有一个UICollectionView显示来自NSFetchedResultsController. collectionView 有一个部分,在该部分中有一个标题。标题允许用户过滤集合视图中的内容。标题视图的委托连接到UIViewController包含集合视图。
一旦用户更改了其中一个过滤器选项,标题视图就会向其委托人发送一条消息。委托更改其的谓词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) 这样的全局标头。