я UITableViewController
подклассы и реализованы следующиеОбновление UITableView вызовет исключение
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
.
*** отказ Assertion в - [UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-984.38/UITableView.m:774
Exception был пойман во время обработки изменения ядра данных: Invalid обновление: неверное число строк в секции 0. число строк, содержащихся в существующей секции после обновления (1) должно быть равно числу строк , содержащейся в этом разделе перед обновлением (1), плюс или минус число вставленных строк или dele ted из этого раздела (вставлено 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;
Так далеко не крушение, но это правильное решение?
Я думаю, 'NSFetchedResultsController' не знает, что раздел будет удален, так как' контроллера: didChangeSection: ... ' никогда не стреляет. Но как справиться с этим? – Pablo
Согласно следам, после изменения объекта и, как результат, количество секций должно быть уменьшено, на самом деле '[[fetchedResultsController sections] count]' возвращает старое значение. Итак, как обновить количество разделов контроллера или аннулировать свойство переходного процесса? – Pablo