Слишком быстрое отображение и скрытие ячеек UITableViewCell с помощью UISwitch приводит к сбоям

У меня есть UITableView, который представляет пользователю некоторые параметры. Некоторые ячейки скрыты, если UISwitch не находится в положении 'On'. У меня есть следующий код:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return switchPush.on ? 6 : 1;
}

// Hooked to the 'Value Changed' action of the switchPush
- (IBAction)togglePush:(id)sender {
    NSMutableArray *indexPaths = [NSMutableArray arrayWithCapacity:0];
    for(int i = 1; i <= 5; i++) {
        [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]];
    }

   [tableView beginUpdates];
    if(switchPush.on) {
        [tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
    } else {
        [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
    }
   [tableView endUpdates];
}

Это работает как ожидалось, пока я не переключу UISwitch дважды в быстрой последовательности (двойным нажатием), в этом случае приложение падает с

Invalid table view update. The application has requested an update to the table view that is inconsistent with the state provided by the data source.

Я знаю, что это вызвано неправильным возвращаемым значением NumberOfRowsInSection, так как переключатель возвращается в исходное положение, пока анимация ячеек все еще воспроизводится. Я пробовал отключать переключатель и подключать код к другим обработчикам событий, но, похоже, ничто не предотвращает сбой. Использование reloadData вместо анимации также решает проблему, но я бы предпочел красивую анимацию.

Кто-нибудь знает правильный способ реализации этого?

6
задан Paul Wagener 7 February 2012 в 18:07
поделиться