2009-12-16 9 views
1

J'ai une configuration de base de données où chaque objet a un NSDate, et une méthode qui renvoie la date comme une chaîne (c.-à-d. «12/15/2009») . Les objets sont affichés dans une vue de table, et je voudrais les trier en sections en fonction de la chaîne de date. Le code exemple d'Apple dans l'application CoreDataBooks utilise cette ligne:Essayer de trier les objets Données de base par date dans la vue de table

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"author" cacheName:@"Root"]; 

Je modifié et utilisé cette ligne dans mon projet:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"workoutDateString" cacheName:@"Root"]; 

Où « workoutDateString » est la méthode qui retourne la date d'un objet d'entraînement comme une chaîne. Ma configuration de base de données fonctionne parfaitement quand je laisse sectionNameKeyPath comme nulle, et je sais aussi que ma méthode workoutDateString fonctionne correctement. Mais quand je mis sectionNameKeyPath à workoutDateString, pas afficher seulement il ne les titres de section, mais chaque fois que j'ajouter un objet d'entraînement, le programme se bloque avec cette erreur:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 1. The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted).'

Ceci est mon premier projet iPhone réel et je vous n'avez aucune expérience avec la mise en place de sections de table. Et croyez-moi, j'ai passé pas mal de temps sur Google à la recherche de solutions.

Répondre

1

J'ai eu exactement le même problème, et j'ai passé énormément de temps à le rechercher. Le code NSFetchedResultsControllerDelegate 'animate changes' provoque de sérieux problèmes lorsque des éléments sont ajoutés à une section complètement nouvelle ou que tous les éléments d'une section sont déplacés dans un autre, laissant la section d'origine avec 0 élément. Je supprimerais tout le code qui souhaite insérer/supprimer des sections/lignes, ou utiliser le code de Jeff LaMarche pour le corriger. http://iphonedevelopment.blogspot.com/2009/11/one-fix-to-nsfetchedresultscontroller.html

EDIT: Vous avez implémenté [tableView: titleForHeaderInSection], n'est-ce pas?

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

J'ajouté le code de Jeff LaMarche et la tableView: méthode titleForHeaderInSection, et maintenant les application se bloque sur le lancement: *** Mettre fin application en raison d'une exception non interceptée 'NSRangeException', raison: « *** - [NSCFArray objectAtIndex:]: index (0) beyond bounds (0) ' –

+0

* _ * temps pour obtenir le débogage, ce sont les deux morceaux de code "connus". – refulgentis

+0

également, vous devriez lire le Guide de programmation de vue de table avant de déplacer plus loin avec le stuff NSFetchedResultsController. Si vous n'avez pas une bonne compréhension des vues de table (c'est-à-dire des choses manquantes comme titleForHeaderInSection), il sera presque impossible de faire apparaître NSFetchedResultsController. – refulgentis

Questions connexes