2011-08-31 21 views
5

En el siguiente código:¿Cómo recuperar el nombre de la sección cuando se usa NSFetchedResultsController y sectionNameKeyPath es una relación?

NSFetchedResultsController *frc = 
[[NSFetchedResultsController alloc] 
initWithFetchRequest:fetchRequest 
managedObjectContext:myManagedObjectContext 
sectionNameKeyPath:@"store" 
cacheName:@"SomeCache" 
]; 

El valor @ "tienda" para sectionNameKeyPath realidad apunta a una relación con una entidad de tienda que tiene un atributo de nombre que realmente necesito como mi título de la sección de cabecera.

Pero la forma en que mi código es de configuración no se puede lograr ya que en lugar de obtener títulos de las secciones como: 0x5b504f0 0x5b51190 ¿Cuáles son las direcciones de datos de código para el objeto de tienda han recuperado por lo que yo puedo decir.

¿Cómo puedo usar NSFetchedResultsController para poder decir que quiero que obtenga el atributo de nombre de lo que obtenga de sectionNameKeyPath: @ "store"? ¿O hay alguna otra solución?

Respuesta

5

Trate sectionNameKeyPath:@"store.name"

+1

¡Gracias! Solo para dar puntales, lo siguiente también ayudó: http://stackoverflow.com/questions/2353924/core-data-fetched-results-controller-and-custom-section-header – pulkitsinghal

1

Sé que esto es un hilo viejo, pero me gustaría añadir mi solución utilizando Swift.

Debo advertir que esta solución depende del formato del nombre de sección devuelto por NSFetchedResultsController, por lo que depende de las implementaciones internas que Apple pueda cambiar.

El nombre de la sección contiene el URI de la ID de objeto en el almacén de datos persistente, por lo que puede obtener el objeto por primera extracción de la URI y luego pedir a la tienda para el objeto con el correspondiente URI

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 
    let sectionInfo = fetchedResultsController?.sections![section] 
    let sectionName = sectionInfo?.name 

    //This part depends on the internal implementation of sectionInfo.name 
    let initialRange = sectionName?.rangeOfString("<") 
    let finalRange = sectionName?.rangeOfString(">") 

    let uri = sectionName?.substringWithRange((initialRange?.endIndex)!..<(finalRange?.startIndex)!) 
    let url = NSURL(string: uri!) 

    let store = fetchedResultsController?.managedObjectContext.persistentStoreCoordinator 

    let objectID = store?.managedObjectIDForURIRepresentation(url!) 
    let coreObject = fetchedResultsController?.managedObjectContext.objectWithID(objectID!) 
    //return the correct property from the object as the title 
    let title = ... 
    return title 
} 

Bueno, necesitas verificar si hay errores (usaría un montón de guard frente a esos let) pero ya entiendes.

Cuestiones relacionadas