«NSInternalInconsistencyException», причина: «попытка удалить элемент 2 из раздела 0, который содержит только 0 элементов перед обновлением» - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть UITextField и UICollectionView.Основываясь на символах в текстовом поле, должен вызыватьсяChangeCharactersInRange и перезагружаться представление коллекции.Приложение вылетало с «NSInternalInconsistencyException», когда пользователь быстро вводит символы.

Вот мой код

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
ItemCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"itemCell" forIndexPath:indexPath];

Item *item = super.itemArray[indexPath.row];
cell.itemName.text = item.name;
cell.detail.text = item.detail;

if (item.image == nil )
{
    NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{

        NSData * imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:item.imageURL]];

        if (imgData == nil)
        {
            UIImage * image = [UIImage imageNamed:@"logo1"];
            item.image = image;
        }
        else
        {
            UIImage * image = [UIImage imageWithData:imgData];
            item.image = image;
        }

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.itemCollectionView reloadItemsAtIndexPaths:@[indexPath]];
        });

    }];

    [_itemQueue addOperation:op];
}
else
{
    cell.image.image = item.image;
}

return cell;
}



- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
    searchStr = [Validation trim:searchStr];

   [super.itemArray removeAllObjects];

   for (Item *searchItem in _allItemsArray)
   {
      if(!([searchItem.name rangeOfString:searchStr options:NSCaseInsensitiveSearch].location == NSNotFound))
      {
         [super.itemArray addObject:searchItem];
      }
   }

   [_itemCollectionView reloadData];

   return TRUE;

}

Это прекрасно работает, когда пользователь вводит символы медленно, но когда пользователь вводит текст быстро, онсбой с исключением «NSInternalInconsistencyException», причина: «попытка удалить элемент 2 из раздела 0, который содержит только 0 элементов перед обновлением».

Похоже, что строка удаляется дважды.Какое будет возможное решение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...