2013-05-02 4 views
0

У меня есть жест в подклассе UITableViewCell под названием ArticleCell, поэтому, когда он вызывается метод в классе UITableViewController, который вызывается для удаления ячейки, которая была пропущена.Когда я пытаюсь удалить UITableViewCell, я получаю эту ошибку: Недопустимое обновление: недопустимое количество строк в разделе 0, но я не могу его исправить

метод делегата выглядит следующим образом:

- (void)swipedToRemoveCell:(ArticleCell *)articleCell { 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:articleCell]; 

    [self.tableView beginUpdates]; 
    [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    [self.tableView endUpdates]; 

    [self.tableView reloadData]; 
} 

Но каждый раз, когда я красть, я получаю эту ошибку:

Invalid update: invalid number of rows in section 0

Дополнительная информация: Он использует Core Data для источника данных, так что использует NSFetchedResultsController. Нужно ли мне что-то обновлять? (Я не затронул ни один из его методов.)

ответ

2

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

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

1

Это происходит потому, что при удалении строки, но вы не удаляете фактический объект из списка, поэтому он возвращает неправильное количество отсчетов для строк или для раздела. вы также должны обновить свой список.

Еще одна вещь, которую вам не нужно перезагружать ваши данные, поскольку она выполняется уже при удалении строки.

0

Используйте это непосредственно путем удаления этого объекта из массива и перегрузки Tableview после этого:

- (void)swipedToRemoveCell:(ArticleCell *)articleCell { 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:articleCell]; 

    [DATASOURCE_ARRAY removeObjectAtIndex:indexPath.row]; // Here DATASOURCE_ARRAY is the array you are using as datasource of tableView 
    [self.tableView reloadData]; 
} 

Надеется, что это помогает.

0

Поскольку вы используете ядро ​​данных, вы можете сделать это

В вашем удаления вызова действий этот код

NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

[self.fetchedResultsController.managedObjectContext deleteObject:object]; 

Переписать этот делегат fetchcontroller ....

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath 
{ 
    UITableView *tableView = self.tableViewIB; 

    switch(type) { 
     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationMiddle]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
      [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      break; 

     case NSFetchedResultsChangeMove: 
      [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 
} 
Смежные вопросы