У меня проблема с обновлением табличного представления, если пользователь вставляет идентичные элементы.
Думаю, это будет легче понять с помощью кода.
У меня есть массив элементов которые в настоящее время показаны в таблице. Когда пользователь добавляет или удаляет некоторые элементы, я сравниваю исходный массив с массивом элементов для добавления или удаления.
Это метод, который сравнивает два массива:
-(BOOL)compareToArray:(NSArray*)array2 blockNewItem:(void (^)(id obj))blockAddItem blockDelItem:(void (^)(id obj))blockDelItem{
BOOL equal = YES;
NSMutableArray *array2Copy = [NSMutableArray arrayWithArray:array2];
for ( id index in self ){
if ( ![array2 containsObject:index] ){
if ( blockDelItem != nil )
blockDelItem( index );
equal = NO;
}else
[array2Copy removeObject:index];
}
for ( id index in array2Copy ){
if ( blockAddItem != nil )
blockAddItem( index );
equal = NO;
}
return equal;
}
Этот метод вызывается из другого класса, который обновляет представление таблицы:
[oldFields compareToArray:newFields blockNewItem:^(CustomTableItem* obj) {
[added addObject:[NSIndexPath indexPathForRow:[newFields indexOfObject:obj] inSection:0]];
} blockDelItem:^(CustomTableItem* obj) {
[removed addObject:[NSIndexPath indexPathForRow:[oldFields indexOfObject:obj] inSection:0]];
}];
[_tableView beginUpdates];
if ( removed.count > 0 ){
[_tableView deleteRowsAtIndexPaths:removed withRowAnimation:UITableViewRowAnimationFade];
}
if ( added.count > 0 ){
[_tableView insertRowsAtIndexPaths:added withRowAnimation:UITableViewRowAnimationAutomatic];
}
_arrayFields = newFields;
[_tableView endUpdates];
Это прекрасно работает, если пользователь не вводит два идентичных элемента в новый массив. В этом случае я получаю сообщение об ошибке «недопустимое количество строк в разделе».
Как заставить это работать в этом случае?