NSFetchedResultsController de l'indice au-delà des limites
Je suis en utilisant un NSFetchedResultsController pour afficher des éléments dans mon tableau: les
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
//Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//Return the number of rows in the section.
return [[self.fetchedResultsController fetchedObjects] count];
}
//Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"TagCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];;
}
Tag *tag = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = tag.name;
return cell;
}
Toutefois, ce code s'arrête au niveau de cette ligne:
Tag *tag = [self.fetchedResultsController objectAtIndexPath:indexPath];
Avec ce message:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)'
J'ai NSLogged [self.fetchedResultsController fetchedObjects]
et je peux confirmer qu'il y a en effet de marquer les objets. Si je remplace cette ligne ci-dessus par ce que tout fonctionne comme prévu:
Tag *tag = [[self.fetchedResultsController fetchedObjects] objectAtIndex:indexPath.row];
Je NSLogged indexPath
et les index sont {0, 0} (section 0 en rangée 0), donc je sais que ce n'est pas un problème avec la section. Je suis extrêmement confus quant à pourquoi ce qui se passe parce que théoriquement, ces deux éléments de code pour faire la même chose. Toute aide est appréciée.
Grâce
MISES à jour:
id section = [[[self fetchedResultsController] sections] objectAtIndex:[indexPath section]];
NSLog(@"Section %@", section); <-- returns a valid section
Ce code entraîne la même exception: Tag *tag = [[section objects] objectAtIndex:[indexPath row];
Si je NSLog
[section objects]
elle renvoie un tableau vide. Je ne sais pas pourquoi [fetchedResultsController fetchedObjects]
retourne un tableau avec les bons objets, et [section objects]
ne retourne rien. Est-ce à dire que les objets que je crée ont pas de section? Voici le code que j'utilise pour ajouter de nouveaux objets:
- (void)newTagWithName:(NSString *)name
{
NSIndexPath *currentSelection = [self.tableView indexPathForSelectedRow];
if (currentSelection != nil) {
[self.tableView deselectRowAtIndexPath:currentSelection animated:NO];
}
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
Tag *newTag = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:self.managedObjectContext];
//Configure new tag
newTag.name = name;
[self saveContext];
NSIndexPath *rowPath = [self.fetchedResultsController indexPathForObject:newTag];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:rowPath] withRowAnimation:UITableViewRowAnimationTop];
[self.tableView selectRowAtIndexPath:rowPath animated:YES scrollPosition:UITableViewScrollPositionTop];
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}
Et voici mon saveContext
méthode:
- (void)saveContext
{
//Save changes
NSError *error;
BOOL success = [self.managedObjectContext save:&error];
if (!success)
{
UIAlertView *errorAlert = [[[UIAlertView alloc] initWithTitle:@"Error encountered while saving." message:nil delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil] autorelease];
[errorAlert show];
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
}
Je fais quelque chose de mal ici?
Vous devez vous connecter pour publier un commentaire.
Je suis tombé sur le même problème. Dans mon cas, il semble être une corruption du fichier de cache. Essayez de renommer votre cache, ou en appelant le
deleteCacheWithName:
.Lors de l'initialisation de votre demande de récupération de contrôleur, vous lui avez donné un
sectionNameKeyPath:
même si vos données n'a pas de sections. Ensuite codés en dur vos tables numéro de la section 1.La demande de récupération du contrôleur est d'essayer de renvoyer un objet à la section de l'index zéro dans une structure de données qui n'a pas de sections à tous.
J'ai reproduit votre erreur dans la navigation par défaut application de modèle en changeant la sectionNameKeyPath de néant pour le nom de l'entité unique attribut.
... et puis changé
et j'obtiens:
Définir la
sectionNameKeyPath:nil
et qui devrait résoudre votre problème.sectionNameKeyPath
est définie à zéro.Êtes-vous compilation contre, le ciblage ou de tests sur le 3.0?
Ce que vous obtenez de retour à partir du code suivant:
Êtes-vous d'obtenir un valide de la section?
Si oui, essayez d'ajouter la ligne suivante:
Si cela produit une erreur, je soupçonne que le problème est dans votre
-tableView: numberOfRowsInSection:
et qu'il est peut-être redonner le mauvais nombre de lignes à laUITableView
. Pouvez-vous modifier votre question et afficher le code de cette méthode ainsi?Mise à jour
Sur la poursuite de l'examen je vois où TechZen était de pointage. Vous dites à la vue de la table que vous avez une section où vous ne pouvez pas. Plus vous dire combien d'objets de l'ensemble de votre
NSFetchedResultsController
a quand vous devriez être répondre un peu plus succinctement.Ici est une légère modification de votre code.
Faire ces changements et de voir quel impact cela a.
Question
Ce que les autres
UITableViewDataSource
méthodes avez-vous mis en œuvre? Sonne comme il peut être plus au moins un persistante erreur dans la mise en œuvre.Section <_NSDefaultSectionInfo: 0x4d36660>
dans la console. J'ai essayé d'ajouter la ligne et il erreurs avec la même exception. Et j'ai déjà posté la-tableView:numberOfRowsInSection:
méthode ci-dessus.sectionNameKeyPath
est déjà nul.eu cette erreur hier soir et il m'a rendu fou. J'ai trouvé que si vous utilisez la table de montage séquentiel pour spécifier le nombre de lignes et sections, il doit correspondre au nombre que vous spécifiez dans votre source de données méthodes. Complètement corrigé l'erreur, vous pouvez tout mettre à 0 dans les attributs de l'inspecteur et juste tout faire de la programmation, ou assurez-vous juste que les deux source de données, les méthodes et les attributs de l'inspecteur de refléter le même nombre de lignes et de sections.
^^