【问题标题】:UICollectionView content is hidden after reloadDataUICollectionView 内容在 reloadData 后隐藏
【发布时间】:2013-09-30 08:51:24
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 嘿,找到解决办法了吗?
  • 不,我不记得找到解决方案
  • 好的,感谢您的回复。

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


【解决方案1】:

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

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

它对我有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多