Сравнение двух массивов, один из которых с дублирующимися элементами - PullRequest
0 голосов
/ 02 марта 2020

У меня проблема с обновлением табличного представления, если пользователь вставляет идентичные элементы.

Думаю, это будет легче понять с помощью кода.

У меня есть массив элементов которые в настоящее время показаны в таблице. Когда пользователь добавляет или удаляет некоторые элементы, я сравниваю исходный массив с массивом элементов для добавления или удаления.

Это метод, который сравнивает два массива:

-(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];

Это прекрасно работает, если пользователь не вводит два идентичных элемента в новый массив. В этом случае я получаю сообщение об ошибке «недопустимое количество строк в разделе».

Как заставить это работать в этом случае?

...