Вот мой первый пост в 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)
При удалении одного элемента приложение выглядит нормально.
Это очень неприятно. Кто-нибудь может помочь мне в этом?
Большое спасибо!