6

我有一个UICollectionView显示来自NSFetchedResultsController. collectionView 有一个部分,在该部分中有一个标题。标题允许用户过滤集合视图中的内容。标题视图的委托连接到UIViewController包含集合视图。

一旦用户更改了其中一个过滤器选项,标题视图就会向其委托人发送一条消息。委托更改其的谓词fetchRequestNSFetchedResultsController调用-[NSFetchedResultsController performFetch:]。接下来,必须通知集合视图内容已更改。这可以通过多种方式完成,但我更喜欢的方式是调用-[UICollectionView reloadData]. 不幸的是,这个方法不像预期的那样工作:当我调用这个方法时,整个集合视图消失了。以下是我对这个问题的一些观察:

  1. 第一个(也是唯一一个)部分的所有单元格和标题都将其hidden标志设置为YES. 我试图通过在-[UIView setHidden:]. 不幸的是,它永远不会在UICollectionView子视图中中断。
  2. collectionView:cellForItemAtIndexPath:调用后从不调用-[UICollectionView reloadData]
  3. collectionView:viewForSupplementaryElementOfKind:atIndexPath:调用后从不调用-[UICollectionView reloadData]
  4. numberOfSectionsInCollectionView:仍然被调用并且仍然返回正确的数字(在这种情况下为 1)。
  5. collectionView:numberOfItemsInSection仍然被调用并且仍然返回正确的数字(在这种情况下为 1)。

到目前为止我为解决这个问题所做的尝试:

  1. 禁用实例上的所有自定义 ( sectionInset, itemSize)UICollectionViewFlowLayout
  2. 禁用实例separatorInset上的所有自定义 ( )UICollectionView
  3. 将标题添加为子视图UICollectionView并进行contentInset相应设置。不幸的是UICollectionView,我不喜欢它的自动布局约束和当我这样做时崩溃。
  4. 调用[UICollectionView reloadSections:]而不是[UICollectionView reloadData]. 这可行,但我不喜欢动画。
  5. 在第一部分手动插入、删除和更新行。只要包含集合视图的视图控制器在内存中,它就可以工作。一旦它解除分配,应用程序就会崩溃并在-[UICollectionView dealloc].

以这种方式设置标头感觉不对,但不幸UICollectionView的是没有像UITableView( tableHeaderView) 这样的全局标头。

4

1 回答 1

6

尝试在主线程中重新加载它们

dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});

它对我有用

于 2015-04-20T10:36:04.250 回答