Как бороться с невидимыми строками во время удаления строк. (UITableViews) - PullRequest
1 голос
/ 16 июня 2009

Я выполняю удаление нескольких строк таблицы. Фактически в этом случае все видимые ячейки фактически удаляются.

Это приводит к тому, что ячейка, расположенная непосредственно под видимым кадром, становится видимой после анимации, поскольку все ячейки над ней теперь исчезли.

Вот проблема, эта ячейка также удаляется. Я предполагаю, что я получаю следующую ошибку, потому что просмотр таблицы требует, чтобы я удалил ячейку, которой нет на экране. (но будет на экране во время / после анимации).

2009-06-15 17:44:30.114 HSS[18175:20b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 4.  The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).'
2009-06-15 17:44:30.117 HSS[18175:20b] Stack: (
    807902715,
    2429263419,
    807986683,
    811271572,
    815059595,
    815007323,
    97367,
    96328,
    96282,
    810768858,
    807687328,
    807683624,
    839142449,
    839142646,
    814752238,
    10968,
    10822
)

Так что мне делать в этой ситуации?

Ниже приведен код, который вызывает исключение. Обратите внимание, что я на самом деле создаю новый массив с именем «FilterTableGroups» в другом методе. Это обновленная модель. «allTableGroups» - это каждый контроллер ячейки. Каждый контроллер ячеек содержит словарь, используемый для заполнения его данных ячеек. Я использую ключ «FilterDataSet», чтобы определить, должна ли ячейка оставаться в отфильтрованной таблице. Во время удаления ячеек таблицы я меняю tableGroups, чтобы указать на обновленную модель. (Я создал свой код, похожий на решение Мэтта Галлахера и Крейга Хоккенберри об использовании Cell Controller для контроля отдельных клеток)

- (void)collapseVisableCells{

NSMutableArray *cellsToRemove = [NSMutableArray array];

for(NSArray *sections in self.allTableGroups){

    for(ScheduleCellController *cellController in sections){

        NSString *shouldDisplayString = (NSString*)[[cellController model] objectForKey:@"filteredDataSet"];

        BOOL shouldDisplay = [shouldDisplayString boolValue];

        if(!shouldDisplay){

            UITableViewCell *theCell = [cellController myCell];

            NSIndexPath *cellPath = [self.tableView indexPathForCell:theCell];
            NSLog([cellPath description]);

            if(cellPath!=nil)
                [cellsToRemove addObject:cellPath];


        }
    }

}



[self.tableView beginUpdates];
tableGroups = self.filteredTableGroups;
[self.tableView deleteRowsAtIndexPaths:cellsToRemove withRowAnimation:UITableViewRowAnimationTop];
[self.tableView endUpdates];

}

1 Ответ

3 голосов
/ 16 июня 2009

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

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];

Каждый раз, когда вы удаляете объект из массива модели, связанный с конкретным разделом tableView, проверяйте, равен ли счетчик нулю, и в этом случае добавьте индекс, представляющий раздел, к индексам:

[array removeObjectAtIndex:indexPath.row];
if(![array count])
    [indexes addIndex: indexPath.section];

Determine all of the indexPaths related to the rows to be deleted, then update the tableView as follows:

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

Дайте мне знать, если это работает для вас.

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