Каков правильный способ удаления строки из UITableView?

У меня есть следующие примеры кода:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { [namesArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } } 

а также

 if ([nameSection count] == 0) { [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; [tableView beginUpdates]; [indexKeys removeObjectAtIndex:section]; [tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade]; [tableView endUpdates]; } 

Обратите внимание на порядок …. в первом примере я сначала удаляю объект из моего массива, а затем удаляю строку из таблицы.

Во втором примере я удаляю строку из таблицы, затем раздел из моего массива, затем раздел из таблицы.

Правильно ли это делать? Или я должен сначала удалить его из пользовательского интерфейса, а затем массивы?

Причина, по которой я спрашиваю, заключается в том, что я получаю некоторых пользователей, которые сообщают об этих авариях, которые я не могу воспроизвести:

NSInternalInconsistencyException – Недопустимое обновление: недопустимое количество строк в разделе 1. Количество строк, содержащихся в существующем разделе после обновления (0), должно быть равно количеству строк, содержащихся в этом разделе, до

с этой трассировкой стека:

 1: libobjc.A.dylib objc_exception_throw 32 2: CoreFoundation [NSException raise:format:] 0 3: Foundation -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] 90 4: UIKit -[UITableView(_UITableViewPrivate) _endCellAnimationsWithContext:] 6042 5: UIKit -[UITableView _updateRowsAtIndexPaths:updateAction:withRowAnimation:] 254 6: UIKit -[UITableView deleteRowsAtIndexPaths:withRowAnimation:] 26 7: Movies _mh_execute_header 253319 8: UIKit -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] 84 9: CoreFoundation -[NSObject performSelector:withObject:withObject:] 52 10: UIKit -[UIApplication sendAction:to:from:forEvent:] 62 

2 Solutions collect form web for “Каков правильный способ удаления строки из UITableView?”

Сначала необходимо обновить модель данных , иначе представление таблицы будет запутано в отношении того, какое правильное количество строк и разделов.

После того, как таблица находится в режиме редактирования, представление таблицы затем спросит источник данных, должна ли каждая строка быть редактируемой. Если метод tableView: canEditRowAtIndexPath: реализован, это вызывается для каждой строки по очереди.

 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0) { return NO; } return YES; } 

Установив, можно ли отредактировать строку, в представлении таблицы запрашивается делегат, стиль редактирования, который должна использовать каждая строка:

 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleDelete; } 

Когда нажата кнопка «Удалить», tableView отправляет сообщение tableView: commitEditingStyle: forRowAtIndexPath: в источник данных. Он принимает три параметра:

1) Ссылка на сам tableView (в случае, если источник данных должен различать несколько табличных экранов).

2) UITableViewCellEditingStyle элемента управления, который только что был использован, – в этом случае UITableViewCellEditingStyleDelete

3) Объект indexPath, определяющий эту строку.

Когда источник данных получает сообщение commitEditingStyle: forRowAtIndexPath: ему нужно сделать две вещи:

1) Обновите модель tableView, удалив объект, представленный строкой в ​​таблице. Помните, что сама таблица – это просто представление, и если мы фактически не удалим объект из модели, он снова появится в таблице при следующей перезагрузке таблицы.

2) Отправьте tableView: deleteRowsAtIndexPath: withRowAnimation: сообщение в таблицуView, чтобы оно обновляло отображение таблицы. В этом случае, поскольку мы имеем дело с Delete, он будет анимировать удаляемую ячейку, сдвигающуюся влево, а затем перемещать ячейки под ней, чтобы закрыть пробел.

 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete) { [self.tableData removeObjectAtIndex:indexPath.row]; NSArray *indexPathArray = [NSArray arrayWithObject:indexPath]; [tableView deleteRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationAutomatic]; } } 

Существует множество анимаций для вставки и удаления табличных ячеек на выбор:

  1. UITableViewRowAnimationFade – строки исчезают и исчезают.
  2. UITableViewRowAnimationRight – вставляемые строки скользят справа; удаленные строки сдвигаются вправо.
  3. UITableViewRowAnimationLeft – вставленные строки перемещаются слева; удаленные строки сдвигаются влево.
  4. UITableViewRowAnimationTop – вставленные строки скользят вниз от нижней части строки выше; удаленные строки скользят вверх в нижней части строки выше.
  5. UITableViewRowAnimationBottom – вставляемые строки перемещаются вверху верхней части ячейки ниже; удаленные строки, по-видимому, покрываются строкой ниже скользящей вверх.
  6. UITableViewRowAnimationNone – просто вставленные строки; удаленные строки просто исчезают.
  7. UITableViewRowAnimationMiddle – Клетки вставляются и удаляются с эффектом аккордеона.
  8. UITableViewRowAnimationAutomatic – tableView автоматически выбирает соответствующий стиль анимации (доступен только в iOS 5 и более поздних версиях).

Здесь великая книга о том, как работать со столами.

  • Как проверить, что UITableViewCell содержит UIView
  • динамическая высота UITableViewCell
  • Как правильно использовать UITableViewCell с UITableViewCellStyle с повторным использованием ячеек?
  • Как скрыть заголовок UITableView, а затем снова открыть его?
  • UIImageView автоматически изменяет размер
  • UITableView, встроенный в другое представление, имеет неправильное положение заголовка раздела
  • Swift Изображения изменяются на неправильные изображения при прокрутке после загрузки асинхронного изображения в UITableViewCell
  • iOS-8 и более поздние версии - UITableView внутри UIAlertController
  • добавление CALayer в UIView с возможностью перерисовки при изменении ориентации
  • Как программно добавить UIToolbar в UITableViewController?
  • Управление данными мобильных приложений
  • Interesting Posts

    Как оживить / изменить кнопку меню, например, приложение «Бумага для Facebook»

    Подтвердить NSTimer, который был признан недействительным

    Swift: каков правильный способ разделить , что приводит к ] с заданным размером подмассива?

    call exit (0) в приложении iphone

    Xcode / Swift 'имя файла используется дважды' ошибка сборки

    Графическая библиотека 3d-графика iOS

    iOS – увеличение тайм-аута для AFHTTPRequestOperationManager

    Firebase записывает мусор в консоль. Xcode – 8 (Swift3)

    Добавьте игровую площадку в существующую Рабочую область (с cocoapods)

    Уведомление об отмене автоматического возобновления подписки: iOS PAYMENT

    Добавление FacebookSDK.framework в мою собственную статическую библиотеку

    Основные данные IOS 10 в хранилище памяти для модульных тестов

    Как возобновить загрузку, когда приложение принудительно – выйти?

    Добавить subview в MasterView UISplitViewController

    iOS 8.3 – Металл, найденный nil при развертывании необязательного значения

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.