我想在我的集合视图中添加新单元格,但在添加数据时没有显示任何内容。
我有一个自定义的UICollectionViewLayout类,它一直运行得很好,我一直在我的数据源中保存虚拟数据来调整布局。现在我摆脱了虚拟数据,没有任何东西出现。
由于应用程序没有中断并且没有任何警告,因此很难找到问题所在的位置,而这里是我找到线索的地方:
(UICollectionViewLayout class)
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSLog(@"ElementsInRect: – Visible cells info: %@", [self.collectionView.visibleCells description]);
...
}
这里,-visibleCells返回一个空数组,即使我添加数据,调用-reloadData并使布局无效。所以我在-collectionView:cellForItemAtIndexPath:中放置了一个断点,结果发现这个方法根本没有被调用。细胞是如何出现的?
任何帮助都将不胜感激。
答案 0 :(得分:1)
数据源方法collectionView:numberOfItemsInSection:必须为collectionView:cellForItemAtIndexPath:返回一个非零数字来调用。当您的数据源中有虚拟数据时,它就是。既然你删除了那个虚拟数据,那么该方法可能会返回0.当你添加数据时,它应该将项目放入你的数据源,然后调用reloadData应该有效。你应该在collectionView:numberOfItemsInSection:中登录一个日志,看看它返回的是什么。
答案 1 :(得分:1)
好的,事实证明问题出在UICollectionViewLayout上。我怀疑其他人是否会遇到这个问题,但为了完整起见,我会写下我的答案:
我一直在调整我的自定义UICollectionViewLayout类,在我认为它运行良好之后,我通过删除已注释掉的旧代码,移动方法等使代码看起来很整洁。
在执行此操作时,我回忆起曾在某处读过在-prepareLayout方法中创建属性,并在调用-layoutAttributesForItemAtIndexPath:或-layoutAttributesForElementsInRect:时返回这些属性的好习惯。对我来说,这是一个移动代码块的问题,所以我认为没什么大不了的。在这个“清洁过程”中,我一定是犯了错误。
令人沮丧的是,无论创建属性的位置如何,代码本身都能正常工作,而且我不知道过去几天出了什么问题。
以下是我用于创建属性对象的代码片段。我最初的问题是在执行第3行时没有调用-collectionView:cellForItemAtIndexPath:。除了移动它之外,我没有改变这部分代码。
for (int i = 0; i < 3; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:self.topLayer];
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];
if (cell) {
UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];
[self.array addObject:attributes];
} else {
NSLog(@"prepLayout: the cell doesn't exist for the index path {%d – %d}", indexPath.section, indexPath.item);
}
}
答案 2 :(得分:0)
部分中的行数 - 可以使用的计数将决定是否调用cellForItemAtIndexPath
。
最初在加载视图时会调用它。在numberOfItemsInSection
内,如果您有数组,[数组计数]可能会返回nil
值。
完成填充数组的过程,然后在集合视图中重新加载数据,这将重新评估numberOfItemsInSection。这可以使用以下代码完成:
[self.myCollectionView reloadData];
“myCollectionView是视图中集合视图项的名称”