6

Attualmente ho una classe che contiene un oggetto data. Questo oggetto data contiene sia l'ora che il giorno. Tutte queste informazioni vengono caricate in un UITableViewCell tramite un NSFetchedResultsController. Devo ordinare le date in sezioni in cui ogni sezione è la data senza l'ora. Ho anche bisogno che ogni sezione sia ordinata in base al tempo. Ecco ciò che il mio _fetchedResultsController attuale assomiglia:Dati principali Ordina per data con FetchedResultsController nelle sezioni

[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; 

L'attributo che ho bisogno di ordinare è l'attributo Entity.due.

+0

È possibile recuperare gli oggetti NSDate e visualizzarli in UITableView? In altre parole, il problema è solo la visualizzazione e l'ordinamento? – Jamie

+0

@Jamie E 'solo un problema ordinarli in sezioni per data (che ignora ore, minuti e secondi) – CoreCode

risposta

8

È possibile controllare l'esempio di dati di base denominato "DateSectionTitles" per ulteriori informazioni, evidenziando le nozioni di base da esso.

Per avere sezioni in base alla data, è necessario prima ordinare per data normalizzata (o semplificata). Prova quanto segue:

Aggiungi un attributo transitorio all'entità nell'editor del modello dati principale. Assicurati che il suo tipo sia NSDate e la sua proprietà temporanea sia selezionata. Aggiorna i tuoi file di classe NSManagedObject aggiungendo la proprietà come forte NSDate. Chiamalo, "data semplificata". Aggiungi anche un'altra proprietà al tuo file .h, chiamala "primitiveSimplifiedDate". Rendilo forte.

In .m utilizzare @dynamic per sia il simpleDate sia il primitiveSimplifiedDate. Questo attributo transitorio dovrebbe utilizzare restituire un NSDate che è stato normalizzato a mezzanotte. Questo livello imposta tutto e ti consente di stabilire le sezioni. Ho usato il codice sulla falsariga di questo:

-(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]; 
} 

Se lo si desidera, questo potrebbe anche essere un attributo effettivo che viene calcolato e memorizzato quando è impostata la data effettiva.

Successivamente, si avranno due descrittori di ordinamento. Il primo descrittore di ordinamento sarà l'attributo transitorio di cui sopra, "semplificatoDate". Il secondo attributo sarà l'attributo "dovuto". Il "simpleDateDate", a condizione che NSFetchedResultsController sia configurato correttamente nel passaggio successivo, ordinerà tutto in base alla sezione.

Infine, è necessario fornire il nome della chiave della sezione quando si assegna/avvia NSFetchedResultsController. In questo caso sarà "semplificatoDate". Come questo:

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

Spero che questo aiuti.

t

+0

Quindi dovrei aggiungere una nuova proprietà alla sottoclasse e aggiungere questo metodo? Come dovrei fare per la proprietà e il nuovo metodo di lavorare insieme? Come dovrebbero apparire le proprietà della proprietà (forte, debole, non anatomica, NSData, dinamica ecc.). Grazie – CoreCode

+0

vedere risposta aggiornata – timthetoolman

+0

Grazie, quando ho la possibilità, proverò per vedere se funziona – CoreCode