collectionView:cellForItemAtIndexPath:没有被调用

时间:2013-09-13 21:07:32

标签: objective-c uicollectionview uicollectionviewcell

我想在我的集合视图中添加新单元格,但在添加数据时没有显示任何内容。

我有一个自定义的UICollectionViewLayout类,它一直运行得很好,我一直在我的数据源中保存虚拟数据来调整布局。现在我摆脱了虚拟数据,没有任何东西出现。

由于应用程序没有中断并且没有任何警告,因此很难找到问题所在的位置,而这里是我找到线索的地方:

(UICollectionViewLayout class)

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{    
     NSLog(@"ElementsInRect: – Visible cells info: %@", [self.collectionView.visibleCells description]);
     ...
}

这里,-visibleCells返回一个空数组,即使我添加数据,调用-reloadData并使布局无效。所以我在-collectionView:cellForItemAtIndexPath:中放置了一个断点,结果发现这个方法根本没有被调用。细胞是如何出现的?

任何帮助都将不胜感激。

3 个答案:

答案 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是视图中集合视图项的名称”