1

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

我有一个自定义 UICollectionViewLayout 类,它工作得很好,我一直在我的数据源中保留虚拟数据来调整布局。现在我摆脱了虚拟数据,什么都没有出现。

由于该应用程序没有崩溃并且没有任何警告,因此很难找出问题所在,这里是我找到线索的地方:

(UICollectionViewLayout class)

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

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

任何帮助,将不胜感激。

4

3 回答 3

1

数据源方法 collectionView:numberOfItemsInSection: 必须返回一个非零数字,以便调用 collectionView:cellForItemAtIndexPath:。当您的数据源中有虚拟数据时,它就是。现在您删除了该虚拟数据,该方法可能返回 0。当您添加数据时,它应该将项目放入您的数据源,然后调用 reloadData 应该可以工作。您应该在 collectionView:numberOfItemsInSection: 中输入一个日志,然后查看它返回的内容。

于 2013-09-13T21:22:04.780 回答
1

好的,事实证明问题出在 UICollectionViewLayout 中。我怀疑其他人会遇到这个问题,但为了完整起见,我会写下我的答案:

我一直在调整我的自定义 UICollectionViewLayout 类,在我认为它运行良好之后,我通过删除被注释掉的旧代码、移动方法等来使代码看起来很整洁。

这样做时,我记得在某处读到过,在 -prepareLayout 方法中创建属性并在调用 -layoutAttributesForItemAtIndexPath: 或 -layoutAttributesForElementsInRect: 时返​​回这些属性是一种很好的做法。对我来说,这只是移动一段代码的问题,所以我认为没什么大不了的。在这个“清洁过程”中,我一定犯了一个错误。

真正令人沮丧的是,无论属性是在哪里创建的,代码本身实际上都可以工作,而且我不知道最近几天出了什么问题。

以下是我用来创建属性对象的代码片段。我最初的问题是问为什么 -collectionView:cellForItemAtIndexPath: 在执行第 3 行时没有被调用。除了移动它之外,我没有更改这部分代码。

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);
    }
}
于 2013-09-18T01:51:53.637 回答
0

部分中的行数 - 可以使用的计数将确定是否cellForItemAtIndexPath被调用。

最初,当视图加载时,它将被调用。在 中numberOfItemsInSection,如果您有一个数组,则 [array count] 可能会返回一个nil值。

完成填充数组的过程,然后在集合视图中重新加载数据,这将重新评估 numberOfItemsInSection。这可以通过以下代码完成:

[self.myCollectionView reloadData];

“myCollectionView 是您视图中的集合视图项的名称”

于 2014-06-01T17:44:00.420 回答