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