具有相同数据源的多个UICollectionView

时间:2013-09-18 20:52:24

标签: ios objective-c uicollectionview

我在同一视图中有几个collectionView,并决定让同一个对象处理数据源职责。当我想要显示的项目数量不同时,我遇到collectionView:numberOfItemsInSection:方法的问题(除非使用虚拟单一返回语句进行测试时,所有时间都是如此)。将来,数字将被动态拉动,但仅用于调试我插入静态值。

该方法几乎可以:

if (cv == self.articlesView) {        
    return 4;
} else if (cv == self.journalsView) {
    return 4;
} else if (cv == self.algorithmsView) {
    return 6;
}
return 10; // this never actually runs

此时以非常基本的方式创建单元格(我刚开始使用此应用程序):

- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [cv dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
    cell.backgroundColor = [UIColor grayColor];        
    return cell;
}

我为viewDidLoad中的每个collectionView运行以下内容:

[cv registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:CellIdentifier];

我得到的错误是EXC_BAD_ACCESS,它附加到应用代理中的[self.window makeKeyAndVisible];行。

如果我将最后collectionView的项目数从6更改为3(基本上,使其小于所有其他项目),应用程序会运行,但现在所有collectionViews的项目数量都会减少,而不仅仅是最后一个(它看起来像iOS第一次运行collectionView:numberOfItemsInSection:它为最后一个collectionView执行它。

所以看起来这个方法第一次运行时,结果会以某种方式粘贴并应用于所有其他方法,然后出现越界错误。然而,我无法弄清楚如何修复,或发现我的极小代码有任何问题。

2 个答案:

答案 0 :(得分:1)

这种情况下的错误源于这样一个事实:我不仅为delegatedataSource重复使用相同的对象,而且我对所有{{1}使用相同的UICollectionViewLayout }}秒。我正在对collectionView对象应用一些自定义,因为我想为所有视图进行相同的自定义,所以我只使用了相同的对象。一旦我将其更改为每个视图都有一个独特的布局对象,只需将循环中的自定义应用到所有视图中 - 不再发生崩溃!

答案 1 :(得分:0)

EXC_BAD_ACCESS表示您有内存错误。首先,确保您使用ARC。然后确保您使用的是访问者,而不是直接访问您的ivars。最后,运行静态分析器,并在那里查找错误。

也就是说,我建议为每个视图子类化数据源,并使用方法覆盖来实现逻辑差异,而不是使用条件逻辑为所有视图提供单个数据源。对于几个对象的成本,您可以更清晰地分离功能,并可能更简单地调试内存错误。