2015-07-21 4 views
2

Я заметил странную разницу в том, как performBatchUpdates:completion: метод работает в iOS7 (плохие сбой) и iOS8 (хорошо). Вот код я использую:Выполнение UICollectionViewBatchUpdates crash iOS7

[self.swapItems removeObject:self.swapItems[indexPath.row]]; 

[self.swapItemsGrid performBatchUpdates:^{ 
    [self.swapItemsGrid deleteItemsAtIndexPaths:@[indexPath]]; 
} completion:^(BOOL finished) { 
    [self layoutViews]; 
}]; 

В iOS8 он отлично работает, в то время как в iOS7 он падает со следующей ошибкой:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]' 

Немного отладки показала, что в iOS8 метод performBatchUpdates:completion: называет данные source collectionView:numberOfItemsInSection:, в то время как в iOS7 это не так, следовательно, ошибка, когда ячейку пытались создать с данными объекта, находящегося в массиве данных, больше нет.

Неужели кто-нибудь еще сталкивается с этой проблемой? Возможно, у вас есть решение?

+0

О, стоит отметить, что это происходит только в том случае, если я удаляю элемент (выполняет код выше - без сбоев), добавляет элемент, снова удаляет элемент (выполняет код выше - CRASH). В обоих случаях, хотя массив 'self.swapItems' является одним и тем же. – artooras

+0

У меня такая же проблема. Вы поняли решение? – Snowman

+0

К сожалению, еще нет. – artooras

ответ

0

self.swapItemsGrid не имеет товара по указанию indexPath. Чтобы избежать этого, используйте это, чтобы проверить indexPath выходов в массиве или нет:

-(BOOL)checkIndexPathExits:(NSIndexPath*)indexPath inArray:(NSArray*)array{ 
    if (indexPath.section < array.count) { 
     if (indexPath.row < [array[indexPath.section] count]) { 
      return YES; 
     } 
    } 
    return NO; 
} 

Надеется, что это может помочь.

+0

Привет. Боюсь, это не так просто. Единственное место, где я могу выполнить этот вид проверки, - это метод 'collectionView: cellForItemAtIndexPath:', и если метод вообще вызван, мне нужно вернуть экземпляр 'UICollectionViewCell'. Вот почему существует метод 'collectionView: numberOfItemsInSection:', чтобы гарантировать, что массив данных имеет достаточные объекты для каждого запрошенного 'indexPath'. – artooras

Смежные вопросы