UICollectionView 内容在 reloadData 后隐藏
Posted
技术标签:
【中文标题】UICollectionView 内容在 reloadData 后隐藏【英文标题】:UICollectionView content is hidden after reloadData 【发布时间】:2013-09-30 08:51:24 【问题描述】:我有一个UICollectionView
,它显示来自NSFetchedResultsController
的内容。 collectionView 有一个部分,在该部分中有一个标题。标题允许用户过滤集合视图中的内容。标题视图的委托连接到包含集合视图的UIViewController
。
一旦用户更改了其中一个过滤器选项,标题视图就会向其委托人发送一条消息。委托更改其NSFetchedResultsController
的fetchRequest
上的谓词并调用-[NSFetchedResultsController performFetch:]
。接下来,必须通知集合视图内容已更改。这可以通过多种方式完成,但我更喜欢的方式是调用-[UICollectionView reloadData]
。不幸的是,这个方法不像预期的那样工作:当我调用这个方法时,整个集合视图消失了。以下是我对这个问题的一些看法:
-
第一个(也是唯一一个)部分的所有单元格和标题都将其
hidden
标志设置为YES
。我试图通过在-[UIView setHidden:]
上设置符号断点来追踪是什么方法导致了这种情况。不幸的是,它永远不会在 UICollectionView
子视图中中断。
collectionView:cellForItemAtIndexPath:
在调用 -[UICollectionView reloadData]
之后永远不会被调用。
在调用-[UICollectionView reloadData]
之后,永远不会调用collectionView:viewForSupplementaryElementOfKind:atIndexPath:
。
numberOfSectionsInCollectionView:
仍然被调用并且仍然返回正确的数字(在本例中为 1)。
collectionView:numberOfItemsInSection
仍然被调用并且仍然返回正确的数字(在本例中为 1)。
到目前为止我为解决这个问题所做的尝试:
-
禁用
UICollectionViewFlowLayout
实例上的所有自定义(sectionInset
、itemSize
)
禁用 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 内容在 reloadData 后隐藏
自动调整UICollectionView高度以调整其内容大小