2014-01-13 3 views
4

Я пытался обернуть голову вокруг метода reloadItemsAtIndexPaths UICollectionView.UICollectionView reloadItemsAtIndexPaths

У меня есть массив объектов, называемых objectsArray. Когда пользователь прокручивается в нижней части моего представления коллекции, я выбираю следующую группу объектов из бэкэнд и добавляю ее к объектуArray, вызывая [objectsArray addObjectsFromArray: objects]; После этого я называю [self.collectionView reloadData], который, как я знаю, дорогой.

Я хотел бы оптимизировать код с нижеследующим кодом, но я получаю сообщение об ошибке при вызове reloadItemsAtIndexPaths.

if (self.searchPage == 0) { 
     parseObjectsArray = [[NSMutableArray alloc] initWithArray:relevantDeals]; 
     [self.collectionView reloadData]; 

    } else { 

     NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 
     for (int i = 0; i < [relevantDeals count]; i++) { 
      NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0]; 
      [indexPaths addObject:indexPath]; 
     } 

     [parseObjectsArray addObjectsFromArray:relevantDeals]; 
     [self.collectionView reloadItemsAtIndexPaths:indexPaths]; 
     //[self.collectionView reloadData]; 
    } 

Ошибка: * отказ Assertion в - [UICollectionView _endItemAnimations], /SourceCache/UIKit/UIKit-2903.2/UICollectionView.m:3716

Любая помощь/советы очень ценится.

Спасибо!

ответ

0

Эта ошибка часто возникает, когда вы увеличить/уменьшить количество элементов в массиве, но он не соответствует метод источника данных

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

Вы обновляя его соответствующим образом?

+0

- (NSInteger) collectionView: (UICollectionView *) коллекцияView numberOfItemsInSection: (NSInteger) раздел { return [parseObjectsArray count]; } Похоже, что он вызывается непосредственно перед утверждением, потому что я NSLogged значение [parseObjectsArray count] и возвращает более высокое значение с новыми объектами, добавленными в массив. Спасибо за предложение! –

5

Похоже, что добавляемые предметы являются новыми, другими словами, вы добавляете элементы, которых раньше не было. В этом случае, просто заменить reloadItemsAtIndexPaths: indexPaths с insertItemsAtIndexPaths:

[self.collectionView insertItemsAtIndexPaths:indexPaths]; // Use this for newly added rows 
//[self.collectionView reloadItemsAtIndexPaths:indexPaths]; // Use this for existing rows which have changed 
+1

Я также пробовал метод insertItemsAtIndexPaths и в итоге получил то же утверждение выше. Спасибо за предложения, хотя! –

3

ошибка утверждение вводит в заблуждение. Только после того, как я осуществил

  @try 
      { 
       [self.collectionView insertItemsAtIndexPaths:indexPaths]; 
      } 
      @catch (NSException *except) 
      { 
       NSLog(@"DEBUG: failure to insertItemsAtIndexPaths. %@", except.description); 
      } 

Я понял, что неправильно вычислял мои индексы. Мое смещение индекса для новых объектов отключилось одним из них, и мой коллекционный образ думал, что я добавляю больше объектов, чем указано в numberOfItemsInSection.

Спасибо всем, кто пытался помочь!

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