2012-09-29 11 views
11

Ich habe ein NSManagedObject für die Abschnitte im gruppierten UITableView. Dieses Objekt hat die Attribute "name" und "createdAt". Ich möchte "Name" in der Benutzeroberfläche für die Abschnitt Titel verwenden, aber nach "createdAt" sortiert. Gemäß der Dokumentation muss der erste sortDescriptor-Schlüssel auch der sectionNameKeyPath des NSFetchedResultsController sein.NSFetchedResultsController - andere Sortierreihenfolge als Abschnittsname

Ich schlug vor, zwei sortDescriptors zu verwenden, aber es funktioniert nicht. Die Abschnitte sind weiterhin nach Namen sortiert.

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

Antwort

38

Ein abgerufener Ergebniscontroller (FRC) verwendet nur den ersten Sortierdeskriptor zum Gruppieren (und Sortieren) der Objekte in Abschnitte. Ein zweiter Sortierungsdeskriptor kann hinzugefügt werden, um die Objekte in jedem Abschnitt zu sortieren.

Außerdem muss der Schlüsselpfad des Sortierungsdeskriptors mit dem sectionNameKeyPath des FRC übereinstimmen (oder mindestens die gleiche relative Reihenfolge generieren).

In Ihrem Fall können Sie wie folgt vorgehen:

  1. Verwenden createdAt als sectionNameKeyPathund in der ersten Art Descriptor.
  2. ändern Sie die titleForHeaderInSection Delegatfunktion die name Eigenschaft statt createdAt zurückzukehren:

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

Hinweis: Wenn Sie mehrere Objekte mit den gleichen name aber unterschiedlichen createAt Werten haben, werden diese gruppiert werden in verschiedene Abschnitte mit dem obigen Ansatz. Ich weiß nicht, ob das ein Problem für dich ist.

+0

Großartig! Es kann so einfach sein. Nein ich verstehe auch die Funktion von mehreren sortDescriptors. Derzeit ist der "Name" meiner Objekte eindeutig, daher ist diese Lösung kein Problem. Danke auch für den Code. – Sebastian

+0

@Sebastian: Gern geschehen. –

+0

Danke für die Antwort. – coreDeviOS

0

Sie sind fast da. Sie müssen den sectionNameKeypath in Ihrem initWithFetchRequest-Aufruf definieren.

Verwandte Themen