Подтвердить что ты не робот

"Попытка создать две анимации для ячейки" Crash on ios

Вот мой первый пост в stackoverflow. Любая ваша помощь будет принята с благодарностью!

Я абсолютно не знаком с разработкой ios. Как практика, я пытаюсь разработать простое приложение, которое отслеживает различные элементы в моей лаборатории. Каждый элемент имеет отношение "один" к его местоположению, и каждое местоположение имеет отношение "многие" к различным элементам.

У меня есть UITableViewController(LocationListTableViewController), который использует NSFectchedResultController в качестве источника данных для tableview. Контроллер tableview также соответствует NSFetchedResultController Delegate, чтобы обновить все NSManagedObject.

После того, как будет выбрано местоположение на LocationListTableViewController, будет нажата кнопка DetailedTableViewController и отобразит элементы в этом месте. Этот DetailedTableViewController имеет переменную экземпляра NSUndoManager для поддержки отмены изменений. Я использую NSMutableArray как источник данных DetailedTableViewController:

NSSet *items = self.location.items;
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"itemName" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSArray *array = [[items allObjects]sortedArrayUsingDescriptors:sortDescriptors];
// itemList is the data source for the table view
self.itemList = [array mutableCopy];

Когда нажата кнопка "Редактировать", пользователи могут удалять элементы, и для этого элемента позиции установлено значение "0". Удаленные элементы переносятся в "changeItem" NSMutableArray, так что изменение может быть отменено:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (!changedItems)
       changedItems = [[NSMutableArray alloc] init];

    // Set the company attribute of selected company to nil
    Item *editingItem = [itemList objectAtIndex:indexPath.row];
    editingItem.company = nil;

    // Add to changedItem array to support canceling
    [changedItems addObject:editingItem];
    // Remove from the data source array
    [itemList removeObject:editingItem];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

Я положил кнопку "Отмена" в качестве элемента кнопки "Левая панель", и при ее нажатии:

 [undoManager endUndoGrouping];
 NSManagedObjectContext *moc = self.location.managedObjectContext;
 [moc rollback];

 // Add item from changedItem array back to itemList array (data source array)
 if ([changedItems count] > 0) {
      [itemList addObjectsFromArray:changedItems];
      [itemList sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
  }

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

*** Assertion failure in -[_UITableViewUpdateSupport _setupAnimationsForNewlyInsertedCells], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableViewSupport.m:599

Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  Attempt to create two animations for cell with userInfo (null)

При удалении одного элемента приложение выглядит нормально.

Это очень неприятно. Кто-нибудь может помочь мне в этом?

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

4b9b3361

Ответ 1

Ячейка, вероятно, не существует - попробуйте NSLogging ее значение или убедитесь, что она создана правильно.

Ответ 2

Просто попробуйте:

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