Vous devez simplement passer "name" comme chemin de clé de la sectionNameKeyPath. Voir ceci réponse à la question "Core Data backed UITableView avec indexation".
UPDATE
Cette solution ne fonctionne que si vous ne vous souciez que d'avoir le défilement rapide du titre de l'index. Dans ce cas, vous ne devez PAS afficher les en-têtes de section. Voir ci-dessous pour un exemple de code.
Sinon, je suis d'accord avec refulgentis qu'une propriété transitoire est la meilleure solution. De plus, lors de la création du NSFetchedResultsController, l'attribut sectionNameKeyPath a cette limitation :
Si ce chemin de clé n'est pas le même que celui spécifié par le premier descripteur de tri du descripteur de tri dans fetchRequest, ils doivent générer les mêmes ordres relatifs. Par exemple, le premier descripteur de tri dans fetchRequest pourrait spécifier la clé pour une propriété persistante ; sectionNameKeyPath pourrait spécifier une clé pour une propriété transitoire dérivée de la propriété persistante.
Implémentations de UITableViewDataSource en utilisant NSFetchedResultsController :
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[fetchedResultsController sections] count];
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return [fetchedResultsController sectionIndexTitles];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
// Don't implement this since each "name" is its own section:
//- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
// id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
// return [sectionInfo name];
//}
MISE À JOUR 2
Pour la nouvelle propriété transitoire "uppercaseFirstLetterOfName", ajoutez un nouvel attribut string à l'entité concernée dans le modèle et cochez la case "transient".
Il y a plusieurs façons d'implémenter le getter. Si vous générez/créez des sous-classes, vous pouvez l'ajouter dans le fichier d'implémentation (.m) de la sous-classe.
Sinon, vous pouvez créer une catégorie sur NSManagedObject (je l'ai placé en haut du fichier d'implémentation de mon contrôleur de vue, mais vous pouvez le répartir entre un en-tête approprié et un fichier d'implémentation propre) :
@interface NSManagedObject (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName;
@end
@implementation NSManagedObject (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName {
[self willAccessValueForKey:@"uppercaseFirstLetterOfName"];
NSString *aString = [[self valueForKey:@"name"] uppercaseString];
// support UTF-16:
NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]];
// OR no UTF-16 support:
//NSString *stringToReturn = [aString substringToIndex:1];
[self didAccessValueForKey:@"uppercaseFirstLetterOfName"];
return stringToReturn;
}
@end
De plus, dans cette version, n'oubliez pas de passer 'uppercaseFirstLetterOfName' comme sectionNameKeyPath :
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext
sectionNameKeyPath:@"uppercaseFirstLetterOfName" // this key defines the sections
cacheName:@"Root"];
Et, pour décomposer tableView:titleForHeaderInSection:
dans l'implémentation de UITableViewDataSource :
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo name];
}