Использование IOS 6 и нового UICollectionView У меня есть 2 UICollectionViews на UIViewController и с помощью раскадровки Я получаю следующую ошибку, когда я нажимаю на 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", причина: "запрос на количество элементов до раздела 2147483647, когда в представлении коллекции есть только 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, но я не знаю, связано ли это с этой проблемой.
Еще раз спасибо за помощь ребятам!
Изменить: Я получаю исключение после вызова методов компоновки... Вот мой пользовательский макет... Я все еще не уверен, как это исправить, поскольку все мои блоки catch 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]);
}
}