Каков правильный способ удаления строки из 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 

  • Установка reuseIdentifier на раскадровке приводит к тому, что пользовательский UITableViewCell не отображается
  • table view больше не является поискомResultsTableView после возвращения из подробного представления
  • Ожидание вызова асинхронной функции для завершения
  • UITableView didSelectRowAt не называется iOS 10, но работает для 9.3.5
  • ios 7 uitableview cell долгое нажатие для изменения значения атрибута данных ядра
  • Добавление UIView за UITableView приводит к тому, что вставки содержимого таблицы не совпадают с topLayoutGuide
  • Изображение неправильно заполняет UIImageView в TableView
  • Могу ли я поместить заголовок таблицы UIPageControl внутри UITableViewController?
  • 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 и более поздних версиях).

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

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