No estoy seguro si entiendo su pregunta por completo, pero sí algo parecido en mi aplicación y aquí es cómo conseguir que funcione:
En primer lugar, el método fetchedResultsController, donde hice las descripciones ordenar y predicados basa en lo que intento hacer En este caso, quiero ordenar los títulos de las películas por fecha de lanzamiento ENTONCES por su nombre. Luego, con mi predicado, tomo entidades de un "tipo" específico y dentro de un cierto rango de 'ReleaseDate'.
En mi definición fetchresultscontroller, estableces sectionNameKeyPath en "releaseDate" para que mis encabezados de sección se basen en una fecha.
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController_ != nil) {
return fetchedResultsController_;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSSortDescriptor *sortByReleaseDate = [[NSSortDescriptor alloc] initWithKey:@"releaseDate" ascending:NO];
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByReleaseDate,sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortByName release];
[sortByReleaseDate release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(type == 'Movies') AND (releaseDate <= %@) AND (releaseDate >= %@)", [NSDate date], [NSDate dateWithTimeIntervalSinceNow:kOneDayTimeInterval*-30]];
[fetchRequest setPredicate:predicate];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Movie" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"releaseDate" cacheName:nil];
...// Perform and return fetch here, error handling etc...
return fetchedResultsController_;
}
Luego, en mi punto de vista mesa de métodos de delegado fuente de datos, vuelvo el título real de cada cabecera después de transformar mi NSDate en NSString (recuerda que tienes que volver NSString para un título de cabecera tableview.
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString *rawDateStr = [[[self.fetchedResultsController sections] objectAtIndex:section] name];
//convert default date string to NSDate...
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"];
NSDate *date = [formatter dateFromString:rawDateStr];
//convert NSDate to format we want...
[formatter setDateFormat:@"d MMMM yyyy"];
NSString *formattedDateStr = [formatter stringFromDate:date];
return formattedDateStr;
}
Así que si quería cambiar la forma en que se está mostrando mis datos a ser organizado por titleName por ejemplo, que cambiaría mi objetivo fetchedResultsController a:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleName" cacheName:nil];
Y modificar mi tableview: titleForHeaderInSection: Método de fuente de datos simplemente devolver el titleName (que ya es una cadena):
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [[[self.fetchedResultsController sections] objectAtIndex:section] name];
}
Espero que esto ayude a encontrar una solución a su problema específico.
Saludos, Rog
Estoy tratando de ordenar mis secciones por displayorder (NSInteger), pero en vez de mostrar el número entero como el título de la sección, me gustaría mostrar el nombre que corresponde a la displayorder. Entonces, en lugar de tener títulos de sección 1, 2 y 3, tendría "Nombre", "Segundo nombre" y "Tercer nombre". ¿Crees que la mejor manera es determinar el título según el orden de visualización en titleForHeaderInSection? – avenged
Es la única forma que yo sepa. Puede hacer un cambio en displayOrder y luego devolver la sección correspondiente que desea mostrar. – Rog
Esperaba que no tuviera que realizar otra búsqueda dentro de titleForHeaderInSection, pero no parece que haya otra manera ... – avenged