我在同一视图中有几个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执行它。
所以看起来这个方法第一次运行时,结果会以某种方式粘贴并应用于所有其他方法,然后出现越界错误。然而,我无法弄清楚如何修复,或发现我的极小代码有任何问题。
答案 0 :(得分:1)
这种情况下的错误源于这样一个事实:我不仅为delegate
和dataSource
重复使用相同的对象,而且我对所有{{1}使用相同的UICollectionViewLayout
}}秒。我正在对collectionView
对象应用一些自定义,因为我想为所有视图进行相同的自定义,所以我只使用了相同的对象。一旦我将其更改为每个视图都有一个独特的布局对象,只需将循环中的自定义应用到所有视图中 - 不再发生崩溃!
答案 1 :(得分:0)
EXC_BAD_ACCESS
表示您有内存错误。首先,确保您使用ARC。然后确保您使用的是访问者,而不是直接访问您的ivars。最后,运行静态分析器,并在那里查找错误。
也就是说,我建议为每个视图子类化数据源,并使用方法覆盖来实现逻辑差异,而不是使用条件逻辑为所有视图提供单个数据源。对于几个对象的成本,您可以更清晰地分离功能,并可能更简单地调试内存错误。