Я выполняю удаление нескольких строк таблицы. Фактически в этом случае все видимые ячейки фактически удаляются.
Это приводит к тому, что ячейка, расположенная непосредственно под видимым кадром, становится видимой после анимации, поскольку все ячейки над ней теперь исчезли.
Вот проблема, эта ячейка также удаляется. Я предполагаю, что я получаю следующую ошибку, потому что просмотр таблицы требует, чтобы я удалил ячейку, которой нет на экране. (но будет на экране во время / после анимации).
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];
}