Редактирование нескольких разделов UITableView одновременно приводит к сбою - PullRequest
0 голосов
/ 15 августа 2010

У меня есть 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;
        }

} }

1 Ответ

0 голосов
/ 19 августа 2010

Я смог решить это самостоятельно, но не так элегантно, как хотел. По сути, я сохраняю переменную-член, чтобы отслеживать, вставил ли я SECTION_ACTIONS в табличное представление. Затем, когда SECTION_FILES изменяется, я делаю:

[tableview beginUpdates];
[tableview insertSection SECTION_ACTIONS];
self.showingActionsSection = YES;
[tableview endUpdates];

или

[tableview beginUpdates];
[tableview deleteSection SECTION_ACTIONS];
self.showingActionsSection = NO;
[tableview endUpdates];

К счастью, делая это, я получаю приятную плавную анимацию при добавлении и удалении объектов. Однако это приводит к тому, что источник данных UITableView ведет себя немного иначе, чем я привык.

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