2012-09-29 25 views
11

Tengo un NSManagedObject para las secciones en el UITableView agrupado. Este objeto tiene los atributos "nombre" y "creadoAt". Quiero usar "nombre" en la interfaz de usuario para los títulos de las secciones, pero ordenado por "createdAt". De acuerdo con la documentación, la primera clave sortDescriptor debe ser también la secciónNameKeyPath del NSFetchedResultsController.NSFetchedResultsController - orden de clasificación diferente al nombre de sección

Sugerí utilizar dos sortDescriptors, pero no funciona. Las secciones todavía están ordenadas por nombre.

- (NSFetchedResultsController *)fetchedResultsController { 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:[CoreDataHelper instance].managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sortName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES]; 

    [fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortName, sortDate, nil]]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:[CoreDataHelper instance].managedObjectContext sectionNameKeyPath:@"name" 
               cacheName:@"Root"]; 
    self.fetchedResultsController = theFetchedResultsController; 

    return _fetchedResultsController; 
} 

Respuesta

38

A resultados controlador descabellada (FRC) utiliza sólo el primer descriptor tipo de grupo (y tipo) los objetos en secciones. Se puede agregar un segundo descriptor de clasificación para ordenar los objetos dentro de cada sección.

Además, la ruta de la clave del descriptor de ordenación debe ser la misma que la sectionNameKeyPath del FRC (o al menos generar el mismo orden relativo).

En su caso, se puede proceder de la siguiente manera:

  1. Uso createdAt como sectionNameKeyPath y en el primer descriptor de tipo.
  2. modificar la función titleForHeaderInSection delegado para devolver la propiedad name en lugar de createdAt:

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
        id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section]; 
        return [[[sectionInfo objects] objectAtIndex:0] name]; 
    } 
    

Nota: Si tiene varios objetos con los mismos name pero diferentes createAt valores, éstos se agruparán en diferentes secciones con el enfoque anterior. No sé si eso es un problema para ti.

+0

¡Estupendo! Puede ser tan fácil. No, también entiendo la función de múltiples sortDescriptors. Actualmente, el "nombre" de mis objetos es único, por lo que esta solución no es problema. Gracias también por el código. – Sebastian

+0

@Sebastian: De nada. –

+0

Gracias por la respuesta. – coreDeviOS

0

Ya casi está allí. Debe definir sectionNameKeypath en su llamada initWithFetchRequest.

NSSortDescriptor *sortDate = [[NSSortDescriptor alloc] initWithKey:@"createdAt" ascending:YES]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDate]]; 

    NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[CoreDataHelper instance] sectionNameKeyPath:@"name"]; 
Cuestiones relacionadas