Vous devez juste passer "nom" comme sectionNameKeyPath. Voir ce answer à la question "Données de base soutenu UITableView avec indexation".
MISE À JOUR
Cette solution ne fonctionne que si vous vous souciez que d'avoir la barre de défilement rapide titre d'index. Dans ce cas, vous n'afficherez PAS les en-têtes de section. Voir ci-dessous pour un exemple de code. Sinon, je suis d'accord avec refulgent pour dire qu'une propriété transitoire est la meilleure solution. En outre, lors de la création du NSFetchedResultsController, le sectionNameKeyPath a cette limitation:
Si ce chemin clé n'est pas le même que celui spécifié par la première sorte descripteur fetchRequest, ils doivent générer les mêmes ordonnancements relatifs. Par exemple, le premier descripteur de tri dans fetchRequest peut spécifier la clé pour une propriété persistante; SectionNameKeyKey peut spécifier une clé pour une propriété transitoire dérivée de la propriété persistante.
implémentations boilerplate UITableViewDataSource 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', ajouter un nouvel attribut de chaîne à l'entité concernée dans le modèle et la vérification la case "transitoire".
Il existe plusieurs façons d'implémenter le getter. Si vous créez/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 mets ce droit en haut du dossier de mise en œuvre de mon contrôleur de vue, mais vous pouvez le diviser entre un en-tête approprié et le fichier de mise en œuvre de son 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
en outre, dans cette version, ne pas oublier de passer 'uppercaseFirstLetterOfName' comme sectionNameKeyPath:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext
sectionNameKeyPath:@"uppercaseFirstLetterOfName" // this key defines the sections
cacheName:@"Root"];
Et, décommenter tableView:titleForHeaderInSection:
dans la mise en œuvre de UITableViewDataSource:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo name];
}
J'ai essayé de mettre le nom comme 'sectionNameKeyPath' mais j'ai fini par avoir une section pour chaque nom retourné. J'ai eu autant de sections qu'il y avait de noms, chaque section avec une seule entrée (le nom). –
Vous n'avez peut-être pas configuré les éléments correctement. Donne la réponse une autre lecture. Cela fonctionne comme annoncé. –
Je ne crois pas que la réponse «fonctionne» en soi, je ne sais pas pourquoi le répondant a agi comme si c'était un miracle d'utiliser le prénom comme un chemin clé. – refulgentis