Intereting Posts
iOS: добавление дополнительного представления из AppDelegate без загрузки В вызовах, отличных от ARC, к необъявленным методам с первым параметром в качестве двойных результатов при повреждении данных. Обнаружение событий пользовательского интерфейса iOS в программно созданных элементах управления Рабочий пример RATreeView в Swift 2? В Cocos2d, как создать слой, который я могу установить его размер области, и будут показаны только его дочерние элементы, которые принадлежат к этой области? Пакеты захвата Wi-Fi IVS. Массив вне диапазона с функцией проверки Перегрузка UILabel в UICollectionView Расширение CallKit в IOS Календарь Kal в раскадровке в сочетании с Tabbar Предупреждения Cocoapods, сомнительные предупреждения Несколько представлений внутри представления и авторезистировать Приостановить частицы в CAEmitterLayer Как заставить узел двигаться навсегда в одном направлении? ios – данные ядра не отображаются при запуске на устройстве

Невозможно программно удалить строку из UITableView

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

-(IBAction)deleteRow:(id)sender{ UIButton *tempButton = (UIButton*)sender; [self updateTotals]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:tempButton.tag inSection:0]; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView reloadData]; [sharedCompra removeItem:tempButton.tag]; tempButton=nil; } 

И я всегда получаю эту ошибку:

 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).' 

Поэтому я не знаю, не хватает ли я чего-то в этом фрагменте кода.

Большое спасибо.

Вы пытаетесь удалить строку, тогда как источник данных все еще отражает исходное состояние (то есть до удаления). Сначала вам нужно обновить источник данных , только тогда вы можете удалить удаление из таблицы viev. Вам также не нужно устанавливать кнопку в nil , и вам не нужно вызывать - reloadData в представлении таблицы:

 - (void)deleteRow:(id)sender { UIButton *tempButton = sender; [self updateTotals]; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:tempButton.tag inSection:0]; [sharedCompra removeItem:tempButton.tag]; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } 

(Тем не менее, вы должны обратить внимание на то, как вы форматируете свой код. )

Вызовите [sharedCompra removeItem:tempButton.tag]; перед [tableView deleteRowsAtIndexPaths... и [tableView reloadData]

Проблема в том, что когда вы вызываете deleteRowsAtIndexPath: он вызывает numberOfRowsInSection который возвращает тот же счетчик из вашей модели.

Также reloadData не нужен reloadData вызов.

При удалении и добавлении строк вам нужно вызвать beginUpdates, вот как он должен выглядеть.

 [tableView beginUpdates]; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView endUpdates]; 

и вам не нужно вызывать reloadData или отменяет анимацию методов deleteRows и insertRows. Но вам нужно сбросить данные, поэтому, если вы используете NSMutableArray, вам нужно сначала удалить объект, поэтому элемент с индексом 0, тогда вы можете удалить строку 0 в таблице. количество строк должно соответствовать количеству объектов в этом массиве, когда оно заканчивается, или оно также будет аварийно завершено.