2009-07-22 10 views
1

Je développe actuellement un journal de vacances comme l'application qui stocke chaque lieu que vous avez visité par son type. Par exemple, un nom de restaurant doit être stocké dans la section «aliments». J'ai réussi à travailler avec des données de base et créer la table sans problème. Cependant, le problème est à chaque fois que je tente de changer le type d'un lieu (donc besoin tableview réordonner), je reçois un message d'erreur:réordonner chercher des résultats contrôleur pour UITableView

2009-07-22 21:04:58.150 HolidayTest[8662:20b] Serious application error. Exception was caught during Core Data change processing: *** -[NSCFArray removeObjectAtIndex:]: index (4) beyond bounds (4) with userInfo (null) 
2009-07-22 21:04:58.151 HolidayTest[8662:20b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray removeObjectAtIndex:]: index (4) beyond bounds (4)' 

Je sais que le délégué du contrôleur de résultats chercher a mis à jour la table. Mais le problème est que le contrôleur d'extraction n'a pas mis à jour ses propres données de section et de ligne. La méthode la plus simple consiste à dire au contrôleur de résultats d'extraction de récupérer ses données si l'utilisateur change de type. Cependant, ce n'est pas un moyen efficace de gérer les données.


Nous vous remercions de votre réponse TahoeWolverine. Voici le code où je change le type d'un endroit où l'utilisateur sélectionne une rangée sur une vue de table pour changer son type.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSIndexPath *selectionIndexPath = [NSIndexPath indexPathForRow:selected inSection:0]; 
    UITableViewCell *checkedCell = [tableView cellForRowAtIndexPath:selectionIndexPath]; 
    checkedCell.accessoryType = UITableViewCellAccessoryNone; 

    [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    selected = indexPath.row; 
    NSManagedObject *aType = [siteType objectAtIndex:indexPath.row]; 
    self.site.type = [aType valueForKey:@"name"]; 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    [self.delegate TypeSelectionController:self didChangeType:YES]; 
} 

ce code correspond au délégué du contrôleur des résultats qui exécute le aller chercher le code suivant

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.tableView beginUpdates]; 
} 


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 

    UITableView *tableView = self.tableView; 

    switch(type) 
    { 
     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
      [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      break; 

     case NSFetchedResultsChangeMove: 
      [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 

} 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id) <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
{ 


    switch(type) 
{ 

     case NSFetchedResultsChangeInsert: 
      [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
    } 

} 


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.tableView endUpdates]; 
} 

alors je vais le faire passer le message d'erreur .......

+0

s'il vous plaît poster les appels de code que vous faites – TahoeWolverine

Répondre

0

Il est difficile pour dire exactement ce que vous voulez dire ici, mais il semble que vous essayez de supprimer au-delà de la fin de votre tableau. Il est difficile de savoir ce que vous feriez.

Si je devais mettre en œuvre, je

A) Supprimez l'entrée de la table:

[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 

B) Supprimez l'entrée de la structure de données.

C) Modifier les données (titre et tout le reste).

D) Ajouter l'entrée où elle doit se trouver dans la structure de données.

E) Ajouter l'entrée où il devrait être dans le tableau:

[tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 

Espoir qui a aidé. Je garderai un oeil si vous mettez à jour la question.

Questions connexes