У меня есть UITableView, поддерживаемый массивом объектов Core Data, созданных путем добавления двух массивов объектов Core Data с именами папок и заметок. Всякий раз, когда я пытаюсь удалить строку из представления таблицы, она выдает:
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 (2) must be equal to the number of rows contained in that section before the update (2), 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).'
Вот код для удаления (в моем подклассе UITableViewCell):
NSManagedObjectContext *context = [NSManagedObjectContext MR_contextForCurrentThread];
[object MR_deleteInContext:context];
[context MR_saveToPersistentStoreAndWait];
[tableViewController loadData];
[tableView deleteRowsAtIndexPaths:@[self.indexPath] withRowAnimation:UITableViewRowAnimationLeft];
Примечание: методы MR_ - это методы MagicalRecord, они делают то, что говорят.
Вот метод loadData в UITableViewController (в основном обновляет массив):
NSPredicate *textParentFilter = [NSPredicate predicateWithFormat:@"parent == %@", self.parent];
self.notes = [Note MR_findAllWithPredicate:textParentFilter];
NSPredicate *folderParentFilter = [NSPredicate predicateWithFormat:@"parentFolder == %@", self.parent];
self.folders = [Folder MR_findAllWithPredicate:folderParentFilter];
Также:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [self.notes count] + [self.folders count];
}
Я понимаю, почему получаю исключение: я удаляю строку в loadData, а затем numberOfRowsInSection не синхронизируется с tableview и Core Data store. Однако, если я заменю deleteRowsAtIndexPaths на [tableView reloadData], он удалится нормально (но без анимации). Я пробовал beginUpdates и endUpdates, меняя порядок удаления вещей, но безрезультатно.
self.notes.count + self.folders.count
== 2, как до, так и после того, как вы сообщаете табличному представлению, что вы что-то удалили. Итак, либо вы фактически ничего не удаляли из своей модели данных, либо вы удалили, а затем что-то добавили. - person Aaron Brager   schedule 17.02.2014deleteRowsAtIndexPaths:
. Не звонитеdeleteRowsAtIndexPaths:
, покаself.notes.count + self.folders.count
не будет == 1. - person Aaron Brager   schedule 17.02.2014NSArray *t = [tableController.folders arrayByAddingObjectsFromArray:tableController.notes];
имел один объект, после него был 0 (что, как я полагаю, является правильным). ВыкидываетTerminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 0 from section 0 which only contains 0 rows before the update'
- person Januzellij   schedule 17.02.2014[tableViewController loadData];
? - person Akhilrajtr   schedule 17.02.2014