在reloadData之后隐藏UICollectionView内容

时间:2013-09-30 08:51:25

标签: iphone ios objective-c cocoa-touch uicollectionview

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

只要用户更改了其中一个过滤器选项,标题视图就会向其委托发出消息。委托更改其fetchRequest的{​​{1}}上的谓词,并调用NSFetchedResultsController。接下来,必须通知集合视图内容已更改。这可以通过多种方式完成,但我喜欢的方式是调用-[NSFetchedResultsController performFetch:]。不幸的是,这种方法不能像预期的那样工作:当我调用这个方法时,整个集合视图就会消失。以下是我就此问题所做的一些观察:

  1. 所有单元格和第一个(也是唯一的)部分的标题都将-[UICollectionView reloadData]标记设置为hidden。我试图通过在YES上设置符号断点来跟踪导致此问题的方法。不幸的是,它永远不会在-[UIView setHidden:]子视图中破坏。
  2. 调用UICollectionView后,
  3. collectionView:cellForItemAtIndexPath:永远不会被调用。
  4. 调用-[UICollectionView reloadData]后,
  5. collectionView:viewForSupplementaryElementOfKind:atIndexPath:永远不会被调用。
  6. 仍然会调用
  7. -[UICollectionView reloadData]并仍然返回正确的数字(在这种情况下为1)。
  8. 仍然会调用
  9. numberOfSectionsInCollectionView:并仍然返回正确的数字(在这种情况下为1)。
  10. 到目前为止,我一直试图解决这个问题:

    1. 禁用collectionView:numberOfItemsInSection实例
    2. 上的所有自定义设置(sectionInsetitemSize
    3. 禁用UICollectionViewFlowLayout实例
    4. 上的所有自定义设置(separatorInset
    5. 将标题作为子视图添加到UICollectionView并相应地设置UICollectionView。不幸的是contentInset不喜欢我用它的自动布局限制和发生崩溃时发脾气。
    6. 致电UICollectionView而非[UICollectionView reloadSections:]。这有效,但我不喜欢动画。
    7. 在第一部分中手动插入,删除和更新行。只要包含集合视图的视图控制器在内存中,这就可以工作。一旦解除分配,应用程序就会因[UICollectionView reloadData]中的断言失败而崩溃。
    8. 以这种方式设置标头感觉不对,但遗憾的是-[UICollectionView dealloc]没有像UICollectionViewUITableView)这样的全局标头。

1 个答案:

答案 0 :(得分:5)

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

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

它对我有用