6

Actualmente tengo una clase que tiene un objeto de fecha en ella. Este objeto de fecha tiene tanto la hora como el día. Toda esta información se carga en un UITableViewCell a través de un NSFetchedResultsController. Necesito ordenar las fechas en secciones donde cada sección es la fecha sin el Tiempo. También necesito que cada sección se ordene sola por tiempo. Esto es lo que se ve mi _fetchedResultsController actual como:Datos principales Ordenar por fecha Con resultados obtenidos Controlador en las secciones

[self.managedObjectContext lock]; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
           entityForName:@"Entity" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

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

[fetchRequest setFetchBatchSize:20]; 

NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil 
               cacheName:@"Root"]; 
theFetchedResultsController.delegate = sender; 
[self.managedObjectContext unlock]; 
return theFetchedResultsController; 

El atributo que necesito para ordenar es el atributo Entity.due.

+0

¿Puede buscar los objetos NSDate y mostrarlos en su UITableView? En otras palabras, ¿el problema es solo la visualización y la clasificación? – Jamie

+0

@Jamie Es solo un problema clasificarlos en secciones por fecha (que ignora horas, minutos y segundos) – CoreCode

Respuesta

8

Es posible que desee consultar la Muestra de datos básicos llamada "DateSectionTitles" para obtener más información, estoy destacando los conceptos básicos de la misma.

Para tener secciones según la fecha, primero debe ordenar por una fecha normalizada (o simplificada). Pruebe lo siguiente:

Agregue un atributo transitorio a su entidad en el editor de modelo de datos principal. Asegúrese de que su tipo sea NSDate y su propiedad transitoria esté marcada. Actualice sus archivos de clase NSManagedObject agregando la propiedad como NSDate fuerte. Llámalo, "día simplificado". También agregue otra propiedad a su archivo .h, llámelo "primitiveSimplifiedDate". Hazlo fuerte.

En .m use @dynamic para simplifiedDate y primitiveSimplifiedDate. Este atributo transitorio debería usar devolver un NSDate que se haya normalizado a la medianoche. Este nivel establece todo y le permite establecer las secciones. He utilizado el código en la línea de lo siguiente:

-(NSDate *)simplifiedDate{ 
    // Create and cache the section identifier on demand. 

    [self willAccessValueForKey:@"simplifiedDate"]; 
    NSDate *tmp = [self primitiveSimplifiedDate]; 
    [self didAccessValueForKey:@"simplifiedDate"]; 

    if (!tmp) { 
     tmp=[self simplifiedDateForDate: [self due]]; 
     [self setPrimitiveSimplifiedDate: tmp]; 
    } 

    return tmp; 
} 


-(NSDate *)simplifiedDateForDate:(NSDate *)date { 

    if (!date) { 
     return nil; 
    } 

    static NSCalendar *gregorian = nil; 

    gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *newDateComponents=[gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit| NSDayCalendarUnit) fromDate:date]; 

    return [gregorian dateFromComponents:newDateComponents]; 
} 

Si así se desea, esto también podría ser un atributo real que se calcula y almacena cuando se establece la fecha real.

A continuación, tendrá dos descripciones de clasificación. El primer descriptor de clasificación será el atributo transitorio anterior, "simplifiedDate". El segundo atributo será el atributo "debido". El "día simplificado", siempre que el NSFetchedResultsController esté configurado correctamente en el siguiente paso, ordenará todo según la sección.

Finalmente debe proporcionar el nombre de la clave de sección cuando alloc/init NSFetchedResultsController. En este caso, será "día simplificado". De esta manera:

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
           managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"simplifiedDate"cacheName:@"Root"]; 

Espero que esto ayude.

t

+0

Entonces, ¿debo agregar una nueva propiedad a la subclase y agregar este método? ¿Cómo podría hacer para que la propiedad y el nuevo método trabajen juntos? ¿Cómo deberían ser las propiedades de la propiedad (fuerte, débil, no ecológica, NSDate, dinámica, etc.)? Gracias – CoreCode

+0

ver la respuesta actualizada – timthetoolman

+0

Gracias, cuando tengo la oportunidad, voy a probar para ver si funciona – CoreCode

Cuestiones relacionadas