У меня есть 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 вместо анимации также решает проблему, но я бы предпочел красивую анимацию.
Кто-нибудь знает правильный способ реализации этого?