У меня есть 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 элементов перед обновлением».
Похоже, что строка удаляется дважды.Какое будет возможное решение?