使用IOS 6和新的UICollectionView 我在UIViewController上有2个UICollectionViews并使用了Storyboard 当我点击UICollectionView时,我收到以下错误 我不确定为什么会发生这种情况,Google会针对此错误返回0结果...
2012-10-13 20:30:06.421 MyApp [768:907]断言失败 - [UICollectionViewData numberOfItemsBeforeSection:],/ SourceCache / UIKit / UIKit-2372 / UICollectionViewData.m:415 2012-10-13 20:30:06.427 MyApp [768:907]由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'当收集视图中只有1个部分时,请求部分2147483647之前的项目数/ p>
我根本没有使用Sections,只将其设置为1个部分:
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
当我点击UICollectionView区域时会发生(似乎是随机的)我有一段代码要从UICollectionView中删除元素:
[tilesArray removeObjectAtIndex:indexPath.row];
[self.tilesCollectionView reloadData];
[resultsArray addObject:str];
[self.resultsCollectionView reloadData];
以下是数组如何连接到UICollectionViews
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
if(collectionView.tag == 2)
return [resultsArray count];
else
return [tilesArray count];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
if(collectionView.tag == 2)
{
static NSString *cellIdentifier = @"ResultCell";
ResultCell *cell = (ResultCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.mainImage.image = [UIImage imageNamed:currentArtContainer.tileMainImage];
NSString *cellData = [resultsArray objectAtIndex:indexPath.row];
[cell.titleLabel setText:cellData];
return cell;
}
else
{
static NSString *cellIdentifier = @"TileCell";
TileCell *cell = (TileCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
cell.topImage.image = [UIImage imageNamed:currentArtContainer.tileTopImage];
cell.mainImage.image = [UIImage imageNamed:currentArtContainer.tileMainImage];
NSString *cellData = [tilesArray objectAtIndex:indexPath.row];
[cell.titleLabel setText:cellData];
return cell;
}
}
请帮我解决这个问题。甚至不确定如何捕获异常,因为它来自UICollectionView内部代码。 也忘了提到我正在使用UICollectionView的自定义布局,但我不知道它是否与此问题有关。
再次感谢您的帮助!
编辑: 在调用所有布局方法后,我得到了异常... 这是我的自定义布局...... 我仍然不确定如何修复它,因为我的所有try catch块都没有捕获错误......
- (void)prepareLayout
{
NSLog(@"In prepareLayout.");
[super prepareLayout];
_cellCount = [[self collectionView] numberOfItemsInSection:0];
}
- (CGSize)collectionViewContentSize
{
NSLog(@"In collectionViewContentSize.");
@try {
CGSize csize = [self collectionView].frame.size;
NSLog(@"In here.");
return csize;
}
@catch(NSException *exception)
{
NSLog(@"collectionViewContentSize %@: %@",[exception name],[exception reason]);
}
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
@try {
NSLog(@"In layoutAttributesForItemAtIndexPath. item %d", indexPath.row);
UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attributes.size = CGSizeMake(ITEM_SIZE, ITEM_SIZE);
NSLog(@"firstRun %d", self.firstRun);
//NSLog(@"panStatus %@", self.panStatus);
if (self.firstRun == 0) {
CGFloat x = 0, y = 0;
CGFloat boundx = self.collectionView.frame.size.width * 0.70; // Use the whole canvas
CGFloat boundy = self.collectionView.frame.size.height * 0.70; // Use the whole canvas
while (x < 50 || x > boundx) x = arc4random() % (int)boundx + indexPath.item;
while (y < 50 || y > boundy) y = arc4random() % (int)boundy + indexPath.item;
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
if (self.positions)
dictionary = [self.positions mutableCopy];
[dictionary setObject:[NSValue valueWithCGPoint:CGPointMake(x, y)] forKey:@(indexPath.item)];
if (!self.positions)
self.positions = [[NSDictionary alloc] init];
self.positions = dictionary;
attributes.center = CGPointMake(x, y);
} else if (self.firstRun > 0) {
CGPoint point = [[self.positions objectForKey:@(indexPath.item)] CGPointValue];
attributes.center = CGPointMake(point.x, point.y);
}
NSLog(@"END layoutAttributesForItemAtIndexPath. item %d", indexPath.row);
return attributes;
}
@catch(NSException *exception)
{
NSLog(@"layoutAttributesForItemAtIndexPath %@: %@",[exception name],[exception reason]);
}
}
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
@try {
NSLog(@"layoutAttributesForElementsInRect ...");
NSMutableArray* attributes = [NSMutableArray array];
for (NSInteger i=0 ; i < self.cellCount; i++) {
NSIndexPath* indexPath = [NSIndexPath indexPathForItem:i inSection:1];
[attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];
}
NSLog(@"END layoutAttributesForElementsInRect ...");
return attributes;
}
@catch(NSException *exception)
{
NSLog(@"layoutAttributesForElementsInRect %@: %@",[exception name],[exception reason]);
}
}
答案 0 :(得分:9)
当从手势识别器运行reloadData时,我发生了这种情况,在手势识别器帮助下设置 delaysTouchesBegan 。
答案 1 :(得分:6)
这里的关键是你的错误中的这个数字:
2147483647
这是NSNotFound
的数值。在代码的某处,您正在对数组执行类似indexOfObject:
的操作,并将其结果作为段或项索引传递到您的集合视图或布局方法之一,这会导致错误。在您的问题中发布的代码中没有发生这种情况,但希望您现在能够找到它。
答案 2 :(得分:5)
这对我有用:
dispatch_async(dispatch_get_main_queue(), ^{
[self.collectionView reloadData];
});
答案 3 :(得分:4)
我自己也遇到了这个断言。它因为我在触摸(滑动)事件中重新加载集合数据而被解雇。
初始触摸(开始)触发didHighlightItemAtIndexPath:
消息,接下来收集数据发生变化(通过滑动),然后触摸(提升)时无法触发didUnhighlightItemAtIndexPath:
消息。
由于我不需要突出显示,解决方案是在我的控制器中实现此方法:
- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}
我希望能帮助其他人遇到这个问题。
答案 4 :(得分:3)
永远不要在手势识别器执行的方法上重新加载UICOllectionView的数据。遵循此规则完全解决了这个问题。 Daltsy建议在UICollectionView中停用highligting也可以防止错误,但也会停用所有“didSelectItemAtIndexPath”委托消息。小心,因为你可能最终得到一个几乎无用的UICollectionView - 就像我几分钟前做的那样。
答案 5 :(得分:0)
我没有禁用突出显示,而是发现确保在调用reloadData之前没有突出显示单元格会阻止&#34;请求在第34页之前的项目数量。错误。
是 UICollectionViewController.CollectionView.deselectItemAtIndexPath
方法或Xamarin中的DeselectItem
。
我保存模型数据中当前所选项目的句柄,清除集合视图的突出显示,计算项目的新NSIndexPaths,然后调用reloadData。通过使用句柄通过其可能的新NSIndexPath属性来再次选择先前选择的项目。
Xamarin中的 selectItemAtIndexPath:animated:scrollPosition:
或SelectItem
。