Índice AZ de NSFetchedResultsController con encabezados de sección individuales dentro de cada letra?

Tengo un NSFetchedResultsController que obtiene datos de una estructura de datos básicos, una list de álbumes. Actualmente está orderado por el artista, así que todas las A, B, etc. Quiero agregar un índice para que el usuario pueda ir rápidamente a cada letra, y estoy usando el código a continuación para hacerlo. El problema es que los encabezados de la sección ahora son "A", "B", "C", etc., lo que significa que he perdido los encabezados de la sección en order alfabético con cada artista individual ("Adele", "América "," Beatles, The ", etc.)

Me gustaría que el índice use las letras de la A a la Z, pero los encabezados de la sección para mostrar los nombres de los artistas en order alfabético. Empujar una letra en el índice saltaría al primer artista con esa letra. ¿Cómo puedo lograr esto (caracteres alfabéticos en el índice, pero un atributo diferente para los títulos de sección)?

EDITAR: si configuro my sectionNameKeyPath en el campo de mi author , el índice AZ está visible, pero las letras no se sincronizan con los nombres, por ejemplo, si presiono S, me lleva a los artistas que comienzan con AL o presionando G toma yo a AB. No estoy muy seguro de por qué esto es, tal vez el índice de la sección está arruinando?

Aquí está el código que estoy usando:

En mi subclass NSManagedObject :

 - (NSString *) firstLetter { [self willAccessValueForKey: @"firstLetter"]; NSString *firstLetter = [[[self author] substringToIndex: 1] uppercaseString]; [self didAccessValueForKey: @"firstLetter"]; return firstLetter; } 

En mi controller de vista, para crear el FRC:

 NSFetchedResultsController *byAuthorFRC = [[NSFetchedResultsController alloc] initWithFetchRequest: _fetchRequest managedObjectContext: [[CDManager shanetworkingManager] managedObjectContext] sectionNameKeyPath: @"firstLetter" cacheName: nil]; 

Y aquí está mi método sectionIndexTitlesForTableView: :

 - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { return [self.fetchedResultsController sectionIndexTitles]; } 

sectionNameKeyPath:@"author" es el parámetro correcto, porque así es como desea que su tabla se agrupe en secciones. La implementación estándar

 - (NSArray *) sectionIndexTitlesForTableView: (UITableView *) tableView { return [self.fetchedResultsController sectionIndexTitles]; } 

devuelve la primera letra de cada encabezado de sección, por lo que no hay necesidad de un método firstLetter por separado.

Para la synchronization correcta desde el índice de sección a las secciones, debe implementar el método de fuente de datos view table tableView:sectionForSectionIndexTitle:atIndex: La implementación estándar en connection con un controller de resultados buscado es:

 - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { return [self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index]; } 

Editar :

Rápido:

 func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? { return fetchedResultsController.sectionIndexTitles } func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int { return fetchedResultsController.sectionForSectionIndexTitle(title, atIndex: index) } 

Swift 2

Agregue esta var a su NSManagedObject

 class Adherent: NSManagedObject { var initialNom: String { self.willAccessValueForKey("initialNom") let initial = (self.nom as NSString).substringToIndex(1) self.didAccessValueForKey("initialNom") return initial } } 

Luego utilícelo en su constructor NSFetchedResultsController (no olvide orderar con el atributo "real")

 let nomSort = NSSortDescriptor(key: "nom", ascending: true) request.sortDescriptors = [nomSort] self.fetchedResultController = NSFetchedResultsController( fetchRequest: request, managedObjectContext: managedObjectContext, sectionNameKeyPath: "initialNom", cacheName: nil) 

En la vista de la tabla , implementa (al less) estos:

 func numberOfSectionsInTableView(tableView: UITableView) -> Int { return self.fetchedResultController.sections!.count } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let sections = self.fetchedResultController.sections! let sectionInfo = sections[section] return sectionInfo.numberOfObjects } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { [...] } func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? { return self.fetchedResultController.sectionIndexTitles } func tableView(tableView: UITableView, sectionForSectionIndexTitle title: String, atIndex index: Int) -> Int { return self.fetchedResultController.sectionForSectionIndexTitle(title, atIndex: index) } func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return self.fetchedResultController.sectionIndexTitles[section] }