Проблема заключается в том, что табличное представление ожидает, что операции, выполняемые в представлении, соответствуют источнику данных. У вас есть одна запись в таблице, и вы удалите ее. В табличном представлении ожидается, что источник данных теперь будет содержать ноль записей, но из-за вашей логики «нет записей» он на самом деле возвращает значение 3, отсюда ошибка согласованности и ваш сбой.
Ошибка, кажется, эта часть:
if ([idArray count] == 0) {
[self.idTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
Я предполагаю, что это было предназначено для вставки строки "нет записей найдено" в таблицу при удалении последней строки, но, так как ваши "записи не найдены" на самом деле занимают три строки, вам нужно вместо этого вставить три строки, например это:
if ([idArray count] == 0) {
[self.idTableView insertRowsAtIndexPaths:[NSArray arrayWithObjects:
[NSIndexPath indexPathForRow:0 inSection:indexPath.section],
[NSIndexPath indexPathForRow:1 inSection:indexPath.section],
[NSIndexPath indexPathForRow:2 inSection:indexPath.section],
nil] withRowAnimation:UITableViewRowAnimationFade];
}
Однако для вашего же здравомыслия я могу предложить другой подход? Вместо того, чтобы пытаться синхронизировать вашу таблицу и источник данных при манипулировании этими поддельными тремя строками данных, которые существуют только для целей отображения, почему бы просто не вставить UILabel в иерархию представлений (перед или за табличным представлением) с надписью " записи не найдены "и показать / скрыть это в зависимости от того, есть ли в таблице какие-либо данные? Таким образом, вы можете точно контролировать его положение и внешний вид, не прибегая к логике источника данных.