1

collectionView在同一个视图中有几个 s,并决定让同一个对象处理数据源职责。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;
}

我为我的每个 collectionViews 运行以下内容viewDidLoad

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

我得到的错误是EXC_BAD_ACCESS它附加到[self.window makeKeyAndVisible];应用程序委托中的行。

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

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

4

2 回答 2

1

这种情况下的错误源于这样一个事实,即我不仅对 and 重用了相同的对象delegatedataSource而且UICollectionViewLayout对所有collectionViews 都使用了相同的对象。我正在对对象应用一些自定义UICollectionViewFlowLayout,因为我希望对所有视图都进行相同的自定义,所以我只使用了相同的对象。一旦我将它更改为每个视图都有一个不同的布局对象,并且只需在循环中对所有视图应用自定义 - 不再有崩溃!

于 2013-09-19T18:11:38.623 回答
0

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

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

于 2013-09-18T21:07:10.443 回答