2016-07-13 5 views
0

angezeigt werden Ich habe eine categoryData und eine itemData, die eine Beziehung von vielen zu vielen hat. Ein categoryData kann mehr als ein itemData und ein itemData kann in einem oder mehreren categorieDatas sein.CoreData Wie in UICollectionView mit nsfetchedcontroller

Ich muss die Elemente gruppieren, in denen sie sich befinden, und eine Liste von Kategorien mit den zugehörigen Elementen anzeigen. Ein categoryData ist ein Abschnitt in der Sammlungsansicht und ein itemData ist die Elemente in dem Abschnitt.

Beispiel

Category1 (section Header) 
ItemA, Item B, ItemC (Items At indexPath) 
Category2 
Item D, Item E, Item A 

ich den folgenden Code bin mit dem nsfetchedcontroller einzurichten, dies zu erreichen.

+ (void) 
getFetchedControllerForCategoryDiscoverDelegate:(id<NSFetchedResultsControllerDelegate>)delegate 
            completion:(void (^)(NSFetchedResultsController *controller)) 
                completion { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"showInDiscover == YES"]; 
     NSFetchedResultsController *controller = [ItemData MR_fetchAllGroupedBy:@"category.order" 
                   withPredicate:predicate 
                    sortedBy:@"category.order" 
                    ascending:YES 
                    delegate:delegate]; 
     completion(controller); 
} 

Aber dies wird mit der folgenden Terminating app aufgrund nicht abgefangene Ausnahme ‚NSInvalidArgumentException‘, Grund abstürzt: ‚zu viele Schlüssel hier nicht erlaubt‘

Wie kann ich dies änderte es zu einer Gruppe zu erhalten, indem Kategorien und zeigen Elemente zugeordnet, wenn es eine Beziehung von vielen zu vielen gibt?

+0

Ich denke, dass Sie die Viele-Viele-Beziehung möglicherweise ersetzen müssen, indem Sie eine Zwischeneinheit hinzufügen (vielleicht "ItemInstance"). 'CategoryData' und' ItemData' würden jeweils eine Eins-Viele-Beziehung zu 'ItemInstance' haben. Ihr FRC würde dann die ItemInstance-Objekte abrufen, sortiert und gruppiert nach 'category.order'. – pbasdf

Antwort

0
Each section create on fetch result controller: 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 2; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    NSInteger numberOfRows = 0; 
    if (section==0) 
    { 
     NSArray *sections =[self.sample_fetchedResultsController sections]; 
     id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:0]; 
     numberOfRows = [sectionInfo numberOfObjects]; 
     return numberOfRows; 
    } 
    else 
    { 
     NSArray *sections =[self.fetchedResultsController sections]; 
     id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:0]; 
     numberOfRows = [sectionInfo numberOfObjects]; 
     return numberOfRows; 

    } 
} 

    - (NSFetchedResultsController*)sample_fetchedResultsController 
    { 
     // if allready created return the created controller; 
     if (_sample_fetchedResultsController) return _sample_fetchedResultsController; 

     // create a managed object context 
     NSManagedObjectContext *context = [[CoreDataController sharedInstance] objectContext]; 

     // create fetch request for demo entities 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"MySample" inManagedObjectContext:context]; 

     [fetchRequest setEntity:entity]; 


     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"friendshipStatus == %@", [NSNumber numberWithInteger:MyCondition]]; 
     [fetchRequest setPredicate:predicate]; 

     // set sort properties 

     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 

     NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
     [fetchRequest setSortDescriptors:sortDescriptors]; 

     [fetchRequest setFetchBatchSize:20]; 

     // create a new NSFetchedResultsController 
     _friends_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                  managedObjectContext:context 
                   sectionNameKeyPath:nil 
                     cacheName:nil]; 
     //             cacheName:@"Root"]; 
     // delegate events to self 
     [_sample_fetchedResultsController setDelegate:self]; 


     return _sample_fetchedResultsController; 
    } 



    Implement fecthedresultcontroller delegates and reload the collection view 
    for example : 
    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    { 
     [self.collectionView reloadData]; 
     self.collectionView.scrollEnabled = true; 

    }