Как удалить последнюю строку раздела?

Эта проблема заставила меня заняться в течение последних часов. У меня есть две секции с одной строкой в ​​каждом разделе. Когда я удаляю строку в одном из разделов, она генерирует исключение, указав, что это недопустимое обновление (количество строк/разделов до и после обновления не совпадает). Это понятно, поскольку я удаляю последнюю строку раздела, и поэтому я исключаю этот раздел. Вопрос заключается в том, как избежать исключения.

Все в порядке с моим источником данных. Я проверил и перепроверял (поверьте мне).

Итак, как заголовок состояния потока, как вы удаляете последнюю строку раздела без получения исключения?

Спасибо,

Барта

Ответы

Ответ 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()