У меня UITableViewController
подкласс и реализовано следующее
NSFetchedResultsController
со своими делегатами
tableView:sectionForSectionIndexTitle:atIndex:
tableView:titleForHeaderInSection:
В controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
В модели данных для данного объекта у меня есть временное свойство uppercaseFirstLetterOfName
, которое будет возвращать первую букву постоянного свойства.
Это все для достижения алфавитных разделов для элементов таблицы и бокового индекса.
Теперь, если у меня есть одна запись для раздела, я переименую его, чтобы он изменил раздел, я получаю следующее исключение, которое происходит где-то после NSFetchedResultsChangeMove
.
*** Ошибка подтверждения в - [UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-984.38/UITableView.m:774
Исключение было обнаружено во время основных данных
обработка изменений: неверное обновление:
неверное количество строк в разделе 0.
Количество строк, содержащихся в
существующий раздел после обновления (1)
должно быть равно количеству строк
содержится в этом разделе до
обновление (1), плюс или минус число
из строк, вставленных или удаленных из этого
раздел (0 вставлено, 1 удалено).
Есть идеи?
UPD еще немного кода:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
NSInteger count = [[fetchedResultsController sections] count];
return count;
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
NSInteger numberOfRows = 0;
if ([[fetchedResultsController sections] count] > 0)
{
id <NSFetchedResultsSectionInfo> sectionInfo =
[[fetchedResultsController sections] objectAtIndex:section];
numberOfRows = [sectionInfo numberOfObjects];
}
return numberOfRows;
}
...
NSSortDescriptor* sortByWordDescriptor = [[NSSortDescriptor alloc]
initWithKey:@"subject" ascending:YES];
NSArray* sortArray = [[NSArray alloc]
initWithObjects:sortByWordDescriptor, nil];
[fetchRequest setSortDescriptors:sortArray];
NSFetchedResultsController* controller = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:@"uppercaseFirstLetterOfName"
cacheName:@"Root"];
UPD (исправлено):
На данный момент я пропатчил код так:
case NSFetchedResultsChangeMove:
NSUInteger tableSectionCount = [self.tableView numberOfSections];
NSUInteger modelSectionCount = [[controller sections] count];
if (modelSectionCount > tableSectionCount)
{
[self.tableView insertSections:[NSIndexSet
indexSetWithIndex:[newIndexPath section]]
withRowAnimation:UITableViewRowAnimationNone];
}
else if(modelSectionCount < tableSectionCount)
{
if (tableSectionCount > 1)
{
[self.tableView deleteSections:[NSIndexSet
indexSetWithIndex:[indexPath section]]
withRowAnimation:UITableViewRowAnimationNone];
}
}
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Пока нет сбоев, но это правильное решение?