我有一个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
) 这样的全局标头。