Как удалить последнюю строку раздела?
Эта проблема заставила меня заняться в течение последних часов. У меня есть две секции с одной строкой в каждом разделе. Когда я удаляю строку в одном из разделов, она генерирует исключение, указав, что это недопустимое обновление (количество строк/разделов до и после обновления не совпадает). Это понятно, поскольку я удаляю последнюю строку раздела, и поэтому я исключаю этот раздел. Вопрос заключается в том, как избежать исключения.
Все в порядке с моим источником данных. Я проверил и перепроверял (поверьте мне).
Итак, как заголовок состояния потока, как вы удаляете последнюю строку раздела без получения исключения?
Спасибо,
Барта
Ответы
Ответ 1
Когда вы удаляете строку, и эта строка является последней из ее разделов, вам также необходимо удалить раздел. В принципе, вам нужно отслеживать как индексы, которые вы хотите удалить, связанные с строками, так и индексы, относящиеся к разделам, которые необходимо удалить, поскольку они больше не содержат строк. Вы можете сделать это следующим образом:
NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet];
Каждый раз, когда вы удаляете объект из массива модели, относящегося к определенному разделу таблицы, проверяйте, равен ли счетчик массива нулю, и в этом случае добавьте индекс, представляющий раздел, к индексам:
[array removeObjectAtIndex:indexPath.row];
if(![array count])
[indexes addIndex: indexPath.section];
Определите все индексы, связанные с удаляемыми строками, затем обновите таблицуView следующим образом:
[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
Это сработало для меня и для других людей, я предложил этот подход.
Ответ 2
Возможно, это может сработать для вас:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger section = [indexPath section];
NSUInteger row = [indexPath row];
NSString *key = [self.keys objectAtIndex:section];
NSMutableArray *rowsInSection = [self.dict objectForKey:key];
[rowsInSection removeObjectAtIndex:row];
NSUInteger rowsInSectionCount = [rowsInSection count];
if (rowsInSectionCount > 0) {
// If we still have rows in this section just delete the row
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
else {
// There are no more rows in this section
[self.dict removeObjectForKey:key];
[self.keys removeObjectAtIndex:section];
NSUInteger sectionCount = [self.keys count];
if (sectionCount > 0) {
// If we still have 1 or more sections left just delete this section
[tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];
}
else {
// If there are no more rows and sections left just delete the last row
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView reloadData];
}
}
}
Надеюсь, это то, что вы искали.
Ответ 3
Это нужно сделать трюк:
// Either delete some rows within a section (leaving at least one) or the entire section.
if ([indexPath section] < 0) {
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if ([indexPath section] == 0) {
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade];
}
Ответ 4
Для Swift 2 после удаления данных в вашей модели:
tableView.beginUpdates()
let indexSet = NSMutableIndexSet()
indexSet.addIndex(indexPath.section)
tableView.deleteSections(indexSet, withRowAnimation: UITableViewRowAnimation.Fade)
tableView.endUpdates()