UICollectionView 内容在 reloadData 后隐藏

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

嘿,找到解决办法了吗? 不,我不记得找到解决方案 好的,感谢您的回复。 【参考方案1】:

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

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

它对我有用

【讨论】:

以上是关于UICollectionView 内容在 reloadData 后隐藏的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UICollectionView 之上实现内容视图

UICollectionView 内容在 reloadData 后隐藏

自动调整UICollectionView高度以调整其内容大小

UICollectionView 第二页内容显示在第一页

有没有办法用内容偏移量初始化 UICollectionView?

在 Swift 的标头中使用分段控件更改 UICollectionView 的内容