Commande d'objects de données de base dans une section de vue de table

J'utilise NSSortDescriptors pour order des objects de données de base et créer des sections de vue de table en fonction d'un atsortingbut de date. À l'aide de ce type de SortDescriptor, les sections de vue de table sont ordonnées comme prévu, mais les lignes à l'intérieur des sections sont également sortingées par le même atsortingbut de date. Y at-il un moyen d'avoir un autre système de command dans chaque section? Je suppose que le principal problème est que les bases de données de base stockent des objects avec des valeurs de date et d'heure, de cette façon, il n'y a pas d'objects ayant exactement la même valeur de date. Mais je devrais order les objects dans la même section en fonction d'un autre atsortingbut. Je vous remercie.

Et voici mon code pour le NSFetchedResultsController:

-(NSFetchedResultsController*)fetchedResultsController{ if (_fetchedResultsController != nil){ return _fetchedResultsController; } NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init]; NSManagedObjectContext *context = self.managedObjectContext; NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"itemDate" ascending:YES]; NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc]initWithKey:@"itemName" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor,sortDescriptor1, nil]; fetchRequest.sortDescriptors = sortDescriptors; _fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"sectionIdentifier" cacheName:nil]; _fetchedResultsController.delegate = self; return _fetchedResultsController; } 

QUESTION RÉVISÉE

C'est le morceau de code ajouté à la méthode cellForRowAtIndexPath:

 int indexpathsection = indexPath.section; [self sortedSectionForIndex:indexpathsection]; NSLog(@"INDEXPATH= %ld", (long)indexPath.section); 

Et voici la méthode proposée par Marcus:

 - (NSArray*)sortedSectionForIndex:(NSInteger)index { NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"priority" ascending:YES]; id section = [[self fetchedResultsController] sections][index]; NSLog(@"INDEX********* = %ld", (long)index); NSArray *objects = [section objects]; NSArray *sorted = [objects sortedArrayUsingDescriptors:@[sort]]; return sorted; } 

Le NSFetchedResultsController est destiné à l'ordre de sorting à contrôler via un seul sorting ou set de sortes. Ce n'est pas destiné à faire ce que vous essayez de faire.

Mais vous pouvez le faire, ce n'est pas aussi propre.

D'abord, la discussion sur le sorting d'une section. Cela ne vous oblige pas à écrire votre propre algorithm de sorting:

 - (NSArray*)sortedSectionForIndex:(NSInteger)index { NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"MyKey" ascending:YES]; id section = [[self fetchedResultsController] sections][index]; NSArray *objects = [section objects]; NSArray *sorted = [objects sortedArrayUsingDescriptors:@[sort]]; return sorted } 

Avec cette méthode, vous pouvez requestr qu'une section soit sortingée chaque fois que vous voulez récupérer un object. Cependant, cela est inefficace car vous sortingez chaque fois que vous voulez toucher un object qui dans un UITableViewController est un LOT .

Au lieu de cela, prenez cet exemple et NSFetchedResultsController votre NSFetchedResultsController et à ses methods déléguées afin de stocker les arrays sortingés et de les synchroniser. De cette façon, vous ne faites que le sorting lorsque datatables changent au lieu de chaque appel de méthode.

Mettre à jour

Le code de sorting que je vous ai fourni ne sortinge pas ce qui est à l' intérieur de NSFetchedResultsController . Il prend ce qui est dans la section, le sortinge et vous renvoie le tableau sortingé. Vous devez donc utiliser ce qu'il returnne:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSArray *sorted = [self sortedSectionForIndex:[indexPath section]]; id object = [sorted objectAtIndex:[indexPath row]]; id cell = ...; //Now get your cell reference //Now update your cell with the data from object return cell; } 

Vous pouvez normaliser le composant time de votre atsortingbut dans la méthode awakeFromFetch de votre NSManagedObject .

 - (void) awakeFromFetch { [super awakeFromFetch]; NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:self.itemDate]; self.itemDate = [[NSCalendar currentCalendar] dateFromComponents:comps]; } 

En outre, en regardant votre code, vous devez dire au NSFetchedResultsController sur quoi il doit baser les sauts de section. Vous faites ceci en fournissant un keyPath pour les sauts de section quand vous l'initialisez. Pour votre cas, au lieu d'utiliser sectionNameKeyPath:@"sectionIdentifier" , utilisez la première key de sorting:

  _fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"itemDate" cacheName:nil];