У меня есть UITableView с 2 разделами. Раздел 0 содержит список имен файлов, и пользователь может нажать на них, чтобы переключить аксессуар галочки. Этот раздел также редактируемый, поэтому пользователь может провести пальцем, чтобы удалить файл / строку. Раздел 1 недоступен для редактирования, содержит 1 строку и действует как кнопка для запуска передачи файлов.
Таким образом, источник данных для таблицы выглядит так:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case SECTION_FILES:
return [files count];
break;
case SECTION_ACTIONS:
if ([files count]) {
return 1; // ROW_ACTIONS_TRANSFER
return 0;
break;
}
return 0;
}
Мне нужно, чтобы раздел 1 отображался только в том случае, если в разделе 0 есть строки. Проблема, которую я нахожу, состоит в том, что когда последняя строка в разделе 0 удаляется, раздел 1 все еще содержит 1 строку. Чтобы удалить строку из раздела 1, я решил, что нужно либо вызвать deleteRowsAtIndexPath, либо reloadSections при фиксации редактирования последней строки в разделе 0, и тогда ячейка будет анимирована. Однако это приводит к сбою приложения, говоря:
Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: недопустимое количество строк в разделе 1. Количество строк, содержащихся в существующем разделе после обновления (1), должно быть равно количеству строк содержится в этом разделе до обновления (1), плюс или минус количество строк, вставленных или удаленных из этого раздела (0 вставлено, 1 удалено). '
Я могу вызвать reloadData для табличного представления, но обновление представляет собой радикальную перерисовку, и я бы предпочел оживить ячейки. Есть ли способ сделать то, что я хочу? Я чувствую, что это должно быть легко, и я упускаю что-то очевидное.
Мой код commitEditingStyle приведен ниже. Сначала я удаляю из своего источника данных (файлов), это рекомендуемый способ, верно?
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
switch ([indexPath section]) {
case SECTION_FILES:
[files removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
// Here is where I would call [tableView reloadData] or [tableView reloadSection...
break;
}
}
}