2012-09-29 4 views
11

Ho un oggetto NSManagedObject per le sezioni nel UITableView raggruppato. Questo oggetto ha gli attributi "nome" e "createdAt". Voglio usare "nome" nell'interfaccia utente per i titoli delle sezioni, ma ordinati per "createdAt". Secondo la documentazione, la prima chiave sortDescriptor deve essere anche la sectionNameKeyPath di NSFetchedResultsController.NSFetchedResultsController - ordine diverso dal nome della sezione

Ho suggerito di utilizzare due sortDescriptors, ma non funziona. Le sezioni sono ancora ordinate per nome.

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

risposta

38

A Risultati prelevati controllore (FRC) utilizza solo il primo descrittore ordinamento al gruppo (e specie) gli oggetti in sezioni. Un secondo descrittore di ordinamento può essere aggiunto per ordinare gli oggetti all'interno di ciascuna sezione.

Inoltre, il percorso chiave del descrittore di ordinamento deve essere uguale a sectionNameKeyPath del FRC (o almeno generare lo stesso ordine relativo).

Nel tuo caso, si può procedere come segue:

  1. Usa createdAt come sectionNameKeyPathe nel primo descrittore sorta.
  2. Modificare la funzione titleForHeaderInSection delegato per restituire la proprietà name invece di createdAt:

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

Nota: Se si dispone di più oggetti con le stesse name ma diversi createAt valori, questi saranno raggruppati in diverse sezioni con l'approccio sopra. Non so se questo è un problema per te.

+0

Ottimo! Può essere così facile. No, capisco anche la funzione di più SortDescriptors. Attualmente il "nome" dei miei oggetti è unico, quindi questa soluzione non è un problema. Grazie anche per il codice. – Sebastian

+0

@Sebastian: prego. –

+0

Grazie per la risposta. – coreDeviOS

0

Sei quasi arrivato. È necessario definire sectionNameKeypath nella chiamata 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"];