je UITableViewController
et mis en œuvre sous-classé les éléments suivantsUITableView Mise à jour fera exception
NSFetchedResultsController
avec ses déléguéstableView:sectionForSectionIndexTitle:atIndex:
tableView:titleForHeaderInSection:
Dans controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
Dans le modèle de données pour l'entité donnée, j'ai la propriété transitoire uppercaseFirstLetterOfName
qui retournera la première lettre de la propriété persistante.
Ceci est tout pour atteindre des sections alphabétiques pour les éléments de table et l'index latéral.
Maintenant, si j'ai un seul enregistrement pour une section, puis je le renommer afin qu'il change la section, je reçois l'exception suivante, qui se produit quelque part après NSFetchedResultsChangeMove
.
*** échec Assertion en - [UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-984.38/UITableView.m:774
Exception a été pris au cours du traitement du changement de base de données : mise à jour non valide: nombre incorrect de lignes dans la section 0. le nombre de lignes contenues dans une section existante après la mise à jour (1) doit être égal au nombre de lignes contenue dans cette section avant la mise à jour (1), plus ou moins le nombre de lignes insérées ou décalées té de cette section (0 inséré, 1 supprimé).
Des idées?
UPD un code plus:
- (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 (patché): Au moment où je patché le code comme ceci:
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;
Alors pas de crash, mais cette solution est-elle correcte?
Je suppose que 'NSFetchedResultsController' ne sait pas que la section est supprimée, car' contrôleur: didChangeSection: ... ' ne tire jamais. Mais comment gérer cela? – Pablo
D'après les traces, après la modification de l'objet, le nombre de sections doit être réduit, en fait '[[sections extraites de sections récupérées] [' fetchedResultsController]] 'renvoie une ancienne valeur. Alors, comment mettre à jour le nombre de sections du contrôleur ou invalider la propriété transitoire? – Pablo